私のデータ構造は多かれ少なかれこのように見えます(質問のために単純化されています)
data GameObject = GameObject { _num :: Int }
data Game = Game { _objects :: [GameObject] }
makeLenses
これらの両方のアクセサーを生成するために使用します。したがって、次のように操作をまとめて行うことができます。
-- loop :: MonadState with Game inside
loop = objects.traversed.num += 1
そして、これは素晴らしいです。
ただし、これと同等の方法を見つけることができません(すべてを印刷num
):
game <- get
let objects = _objects game
let objectNums = map _num objects
mapM_ print objectNums
私は次のようなことを試しました
uses (objects.traversed.num) >>= mapM_ print
しかし、そのような状態で使用する唯一の方法はtraversed
、モノイドを使用することであり、フィールドを結合したくありません。state に存在するいくつかのシーケンスからの要素のすべての要素の一部に対してモナド アクションを実行したいと考えています。
それで、これは提供されたレンズ関数を使用して可能ですか、それとも自分で書く必要がありますか?