6

単純な「動的型付け」言語用の 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 表現を変更しますが、レンズを使用してリストにインデックスを付ける方法を知っておくと役立ちます。

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 に答える