単純な「動的型付け」言語用の AST ライブラリを作成しています。構文ツリーとパーサーを作成しました。現在、私は AST の操作に取り組んでおり、その目的で lens パッケージを使用することに興味があります。
検討
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 表現を変更しますが、レンズを使用してリストにインデックスを付ける方法を知っておくと役立ちます。