我正在为一个简单的“动态类型”语言编写AST库。我编写了语法树和解析器。现在我正在努力操纵AST,我有兴趣为此目的使用镜头包。
考虑
data Obj = Obj !(Map Text Obj)
| Arr ![Obj]
我可以写一个镜头来轻松操作对象字段:
field t (Obj m) = m^.at t
field _ _ = Nothing
但我不知道从哪里开始操作Arr元素。我想要一个镜头:
arrIx :: Int -> Obj -> Maybe Obj
arrIx i (Arr objs) = objs^.someLensHere i
where someLensHere i = undefined
为了方便起见,我会更改我的Obj表示,但知道如何使用镜头对列表编制索引仍然会有所帮助。
答案 0 :(得分:7)
要使用镜头索引列表,请使用ix。例如:
>>> let myList = [1,4,2,212,5]
>>> myList ^? ix 2 -- (^?) gets the result as a Maybe
Just 2
>>> preview (ix 10) myList -- preview is the non-operator version of (^?)
Nothing
>>> myList & ix 3 .~ 4 -- Set the 4zh element to 4.
[1,4,2,4,5]
>>> myList & ix 10 .~ 5 -- Inserting new elements is not possible
[1,4,2,212,5]
还有另一个关于Difference between at and ix的问题。