【发布时间】:2012-06-08 20:51:00
【问题描述】:
我有一个返回 monad 的 Haskell 函数,声明如下:
data Options = Options {
optGames :: Int,
optSuits :: Int,
optVerbose :: Bool
} deriving Show
playGame :: Options -> StateT StdGen (WriterT [String] IO)) Bool
此函数玩单人纸牌游戏,然后返回一个指示输赢的布尔值,以及WriterT monad 中的日志。
我想调用这个函数一定次数,每次都使用随机生成器 (StdGen) 的“下一个”值,并将 Bool 返回值连接到一个列表中。
我尝试创建一个递归函数来执行调用,但不知道如何将 monad 传递到每个下一次迭代中。
我想效仿
initial state >>= playGame >>= playGame ... -- repeat N times
并收集所有生成的Bool 值,以及来自WriterT monad 的日志条目。
最好的方法是什么?
【问题讨论】:
-
initial state >>= playGame >>= playGame的类型不正确。我可以猜到你的意思,但如果我不必猜测,我也可以给出更好、更自信的答案:) -
它的类型不太好,因为我仍在努力研究应该是什么类型。我已经浏览了所有我能找到的转换器示例,但 Haskell 绝对是我所使用过的最严格的数学语言,而且我很难理解其中的一些示例。
标签: haskell loops monad-transformers