无法使用镜头从嵌套JSON收集值

问题描述 投票:3回答:1

编辑

经过几次随机排列后,我设法得到了答案。但是我仍然不明白为什么前者可以工作,但是后者不起作用:

x ^.. (key "conversations") . values . (key "id") . _String

-- vs

x ^@.. (key "conversations") . values . (imap (\ _ v -> v ^? key "id"))

原始问题

我具有以下形状的JSON:

{
  "conversations":[
    {"id":"abc", ...}, 
    {"id":"abc", ...}, 
    {"id":"abc", ...}, 
    ...
  ]
}

我正在尝试使用以下表达式获取conversations.*.id ...

x ^@.. (key "conversations") . values . (imap (\ _ v -> v ^? key "id"))

...这将导致以下编译器错误:

    • Couldn't match type ‘Maybe’
                     with ‘Const
                             (base-4.13.0.0:Data.Semigroup.Internal.Endo [(Int, Value)])’
      Expected type: IndexedGetting
                       Int
                       (base-4.13.0.0:Data.Semigroup.Internal.Endo [(Int, Value)])
                       BSL.ByteString
                       Value
        Actual type: Indexed
                       Int
                       Value
                       (Const
                          (base-4.13.0.0:Data.Semigroup.Internal.Endo [(Int, Value)]) Value)
                     -> BSL.ByteString -> Maybe BSL.ByteString

values似乎是“对数组元素的indexed遍历””,而imap似乎是FunctorWithIndex,那么为什么它不按预期构成?我想念什么?

PS:我注意到大约2年前我问过一个similar question。这个问题在概念上是否相同?我是否缺少对镜片的一些基本了解?

haskell lens aeson
1个回答
0
投票

经过几次随机尝试,我设法得到了答案排列。但是我仍然不明白前者为什么起作用,但是后者不:

x ^.. (key "conversations") . values . (key "id") . _String

-- vs

x ^@.. (key "conversations") . values . (imap (\ _ v -> v ^? key "id"))

imap是映射函数,是imap的变体,可以访问索引。它不是光学元件,因此您无法以这种方式与其他光学元件组合。尽管存在fmapimap的索引设置器版本,但仍然无济于事,因为imapped需要折叠,而imapped需要索引折叠。另一方面,(^..)设置了一个遍历,该遍历可用于按您想要的方式检索特定属性,因为所有遍历都是折叠。

© www.soinside.com 2019 - 2024. All rights reserved.