Haskell 如何使用镜头在Aeson对象中的所有键/值对上进行concatMap

Haskell 如何使用镜头在Aeson对象中的所有键/值对上进行concatMap,haskell,haskell-lens,aeson,Haskell,Haskell Lens,Aeson,我一直在摆弄Control.Lens.Indexed中的组合器,尤其是,但我还没能用镜头想出一个具有以下类型sig的函数: 所需的功能是。另外,请注意,members使用AsValue实例遍历类型,而Object没有这样的实例,因此我们需要将其包装为Value import qualified Data.Aeson as Aeson import Control.Lens import Data.Aeson.Lens import Data.Text func :: Aeson.Object

我一直在摆弄Control.Lens.Indexed中的组合器,尤其是,但我还没能用镜头想出一个具有以下类型sig的函数:

所需的功能是。另外,请注意,
members
使用
AsValue
实例遍历类型,而
Object
没有这样的实例,因此我们需要将其包装为
Value

import qualified Data.Aeson as Aeson
import Control.Lens
import Data.Aeson.Lens
import Data.Text

func :: Aeson.Object -> (Text -> Aeson.Value -> [a]) -> [a]
func obj f = iconcatMapOf members f (Aeson.Object obj)

请您解释一下
iconcatMap
iconcatMap
之间的区别好吗?@SaurabhNanda
iconcatMap
使用
FoldableWithIndex
实例折叠数据结构
iconcatMapOf
在结构上折叠,但您还可以使用索引遍历(这里具体是一个getter)指定折叠方式。因此,使用
iconcatMapOf
,通过指定不同的遍历,您可以按相反的顺序、任意顺序或某些元素进行折叠,而使用
iconcatMap
,您只能按默认方式(由类实例给定)进行折叠,
Object
Value
没有
FoldableWithIndex
实例(它们没有正确的开始类型),因此只能使用自定义折叠来折叠它们。
import qualified Data.Aeson as Aeson
import Control.Lens
import Data.Aeson.Lens
import Data.Text

func :: Aeson.Object -> (Text -> Aeson.Value -> [a]) -> [a]
func obj f = iconcatMapOf members f (Aeson.Object obj)