Haskell 如何使用镜头在Aeson对象中的所有键/值对上进行concatMap
我一直在摆弄Control.Lens.Indexed中的组合器,尤其是,但我还没能用镜头想出一个具有以下类型sig的函数: 所需的功能是。另外,请注意,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
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
之间的区别好吗?@SaurabhNandaiconcatMap
使用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)