我能以恆定的指標,像這樣創建列表的IndexedTraversal
:混淆組成索引鏡頭
constIndex :: i -> Lens.AnIndexedLens i a b a b
constIndex index f = Lens.indexed f index
constIndexedList :: i -> Lens.AnIndexedTraversal i [a] [b] a b
constIndexedList index = Lens.cloneLens (constIndex index) <. traverse
然而這樣的:
constIndexedList :: i -> Lens.AnIndexedTraversal i [a] [b] a b
constIndexedList _ _ [] = pure []
constIndexedList index f (x:xs) = (:) <$> Lens.indexed f index x <*> constListIndex index f xs
我寧願通過組合2簡單的鏡頭創建無法類型檢查,並從lens
類型錯誤不是我很容易明白的:
• Couldn't match type ‘Lens.Indexed
i (t0 a) (Lens.Bazaar (Lens.Indexed i) a b (t0 b))’
with ‘[a] -> Lens.Bazaar (Lens.Indexed i) a b [b]’
Expected type: Lens.Indexed
i (t0 a) (Lens.Bazaar (Lens.Indexed i) a b (t0 b))
-> [a] -> Lens.Bazaar (Lens.Indexed i) a b [b]
Actual type: ([a] -> Lens.Bazaar (Lens.Indexed i) a b [b])
-> [a] -> Lens.Bazaar (Lens.Indexed i) a b [b]
• In the first argument of ‘(<.)’, namely
‘Lens.cloneLens (constIndex index)’
In the expression: Lens.cloneLens (constIndex index) <. traverse
爲什麼我不能像這樣組成索引鏡頭?
我最終找到一個不同的模塊化的方式來做到這一點(Lens.reindexed (const index) Lens.traversed
,但我仍然不知道爲什麼上面提到的方法不起作用..