我将如何创建一个 returns True 一会儿,然后 False 的 IO Bool ?

How would I create an IO Bool that returns True for a while, then False thereafter?

今天我试图加深对 IO monad 的理解,我尝试编写一个函数,它接受一个 Int n 和 returns 一个 IO Bool比产生 True n 次,然后 False 永远。

trueThenFalse :: Int -> IO Bool

通常我会用递归来解决类似的问题,但这里似乎没有什么可以递归的。

我将如何实现这个功能? and/or 这样做是否可行?

作为 IO (IO Bool) 可能更有意义,因为您必须先设置一些状态:

trueThenFalse n = do
  holder <- newMVar n
  return (modifyMVar holder (\ k -> return (k - 1, k > 0)))

这会创建一个可变容器来存储 "left," 和 returns 有多少个 True 的计数,另一个 IO 操作可以 运行 多次,修改如果计数 > 0,则计数并返回 True