我有一个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中的日志条目。
这样做的最佳方式是什么?
答案 0 :(得分:9)
我认为你正在寻找replicateM
。这会将指定的操作重复指定的次数,并将结果作为列表返回。所以replicateM n playGame
对应于玩n
次游戏并获得结果列表。