4

私のデータ構造は多かれ少なかれこのように見えます(質問のために単純化されています)

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 に存在するいくつかのシーケンスからの要素のすべての要素の一部に対してモナド アクションを実行したいと考えています。

それで、これは提供されたレンズ関数を使用して可能ですか、それとも自分で書く必要がありますか?

4

2 に答える 2

6

どうですか

mapMOf_ (objects . traversed . num) print

または、それを状態モナドの状態に適用したい場合は、

get >>= mapMOf_ (objects . traversed . num) print

? (おそらく、最初の行と状態モナドの状態を組み合わせるレンズのような方法があるかもしれません。もしそうなら、私はそれについて自分で学びたいと思います。)

于 2014-02-24T19:44:04.787 に答える