6

我正在为一种简单的“动态类型”语言编写 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 表示,但了解如何使用 lens 对列表进行索引仍然会有所帮助。

4

1 回答 1

9

要使用 lens 索引列表,请使用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]    

关于at 和 ix 之间的区别还有另一个问题。

于 2013-09-14T19:22:07.050 回答