4

我已经看到使用iteratereplicate为了应用函数n时间的解决方案。但是,我没有设法在 State monad 中使用它。

此代码有效:

-- 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

这是有道理的,因为 iterate 需要一个a -> a函数,而我所拥有的是a -> m a或类似的东西。所以,我真的不知道如何从那里去。

4

1 回答 1

7

我认为您正在寻找<=<>=>来自Control.Monad. 它们可以折叠在您制作的列表中replicate以创建一个大动作。

试试foldr (<=<) return (replicate 42 placeRandomWall)

于 2012-10-24T04:09:49.967 回答