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