经过几次随机排列后,我设法得到了答案。但是我仍然不明白为什么前者可以工作,但是后者不起作用:
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。这个问题在概念上是否相同?我是否缺少对镜片的一些基本了解?
经过几次随机尝试,我设法得到了答案排列。但是我仍然不明白前者为什么起作用,但是后者不:
x ^.. (key "conversations") . values . (key "id") . _String -- vs x ^@.. (key "conversations") . values . (imap (\ _ v -> v ^? key "id"))
imap
是映射函数,是imap
的变体,可以访问索引。它不是光学元件,因此您无法以这种方式与其他光学元件组合。尽管存在fmap
,imap
的索引设置器版本,但仍然无济于事,因为imapped
需要折叠,而imapped
需要索引折叠。另一方面,(^..)
设置了一个遍历,该遍历可用于按您想要的方式检索特定属性,因为所有遍历都是折叠。