重复调用Haskell monad

时间:2012-06-08 20:51:00

标签: haskell loops monad-transformers

我有一个Haskell函数返回一个monad,声明如下:

data Options = Options {
    optGames :: Int,
    optSuits :: Int,
    optVerbose :: Bool
  } deriving Show

playGame :: Options -> StateT StdGen (WriterT [String] IO)) Bool

此功能播放一个单人游戏,然后返回一个表示输赢的布尔值,以及WriterT monad中的日志。

我想将此函数调用设定次数,每次使用随机生成器的“next”值(StdGen),并将Bool返回值连接到列表中。

我尝试创建一个递归函数来执行调用,但无法弄清楚如何将monad传递到每个下一次迭代。

我想模仿

initial state >>= playGame >>= playGame ... -- repeat N times

并收集所有生成的Bool值以及WriterT monad中的日志条目。

这样做的最佳方式是什么?

1 个答案:

答案 0 :(得分:9)

我认为你正在寻找replicateM。这会将指定的操作重复指定的次数,并将结果作为列表返回。所以replicateM n playGame对应于玩n次游戏并获得结果列表。