haskell - 重复调用 Haskell monad

标签 haskell loops monad-transformers

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

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

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

此函数玩单人纸牌游戏,然后返回一个指示胜利或失败的 bool 值,以及 WriterT monad 中的日志。

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

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

我想效仿

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

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

最好的方法是什么?

最佳答案

我认为您正在寻找replicateM。这会重复给定的操作指定的次数,并以列表形式返回结果。因此,replicateM n playGame 相当于玩游戏 n 次并获取结果列表。

关于haskell - 重复调用 Haskell monad,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10955889/

相关文章:

javascript - 将数组传递给 JavaScript 中具有循环的函数

java - 如果现有文件已存在,如何创建新文件?

haskell - 是否/应该将函数包装到 monad 转换器中被视为不好的做法?

scala - NonEmptyList 的 Monad 转换器?

haskell - $ 和 () 的区别

haskell - 全部约束

haskell - 类型正确的功能可以不适用吗? ( haskell )

regex - "=~"提高 "No instance for (RegexContext Regex [Char] [String])"

python - 隐藏测试失败,找不到缺陷

haskell - 自定义 monad 的 MonadTransControl 实例