Редактировать
Мне удалось получить ответ после нескольких случайных перестановок. Но я до сих пор не понимаю, почему первый работает, а второй нет:
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
значения кажутся «индексированными обходом элементов массива», а imap
- FunctorWithIndex
, так почему же это не скомпилируется должным образом? Чего мне не хватает?
PS: я заметил, что задал аналогичный вопрос около 2 лет go. Этот вопрос концептуально одинаков? Я скучаю по основам c понимания линз?