4

関数時間を適用するために、iterateまたはを使用するためのソリューションを見てきました。しかし、私は州のモナド内でそれを使用することはできません。replicaten

このコードは機能します:

-- Stuff an empty game level with obstacles.
generateLevel :: Level -> State StdGen Level
generateLevel lvl =
    placeRandomWall lvl >>= placeRandomWall >>= placeRandomWall

これも当然のことながら機能します。

generateLevel :: Level -> State StdGen Level
generateLevel lvl =
    placeRandomWall =<< placeRandomWall =<< placeRandomWall lvl

ただし、これは次のものと同じではありません。

generateLevel :: Level -> State StdGen Level
generateLevel lvl =
    (placeRandomWall =<< placeRandomWall =<< placeRandomWall) lvl

最新のものはタイプについて不平を言っています。したがって、私はできませんfoldl (=<<) id (relicate 42 placeRandomWall)し、できませんiterate

これは理にかなっています。繰り返しはa -> a関数を取りますが、私が持っているのはa -> m aそのようなものです。だから、そこからどうやって行くのか本当にわかりません。

4

1 に答える 1

7

私はあなたが探していると思い<=<ます。それらは、 1つの大きなアクションを作成するために作成したリスト全体で折りたたむことができます。>=>Control.Monadreplicate

試してみてくださいfoldr (<=<) return (replicate 42 placeRandomWall)

于 2012-10-24T04:09:49.967 に答える