我如何创建一个返回True一段时间的IO Bool,然后再返回False?

Sea*_*ean 2 haskell

今天我试图加深对IO monad的理解,并且我尝试编写一个函数,它接受Int n并返回一个IO Bool生成True n时间,然后False永远.

trueThenFalse :: Int -> IO Bool
Run Code Online (Sandbox Code Playgroud)

通常我会用递归来解决类似这样的事情,但是这里似乎没有任何东西可以递归.

我该如何实现这个功能?这样做是否可行和/或可取?

Lou*_*man 6

它可能更有意义IO (IO Bool),因为你必须首先建立一些状态:

trueThenFalse n = do
  holder <- newMVar n
  return (modifyMVar holder (\ k -> return (k - 1, k > 0)))
Run Code Online (Sandbox Code Playgroud)

这创建了一个可变的持有者来存储多少次"离开"的计数,并返回另一个IO可以多次运行的操作,修改计数并True在计数> 0时返回.

  • 当然,但是你必须担心每次使用unsafePerformIO时,小猫会死掉,最终ASPCA出现在你的门口,一切都很糟糕. (6认同)
  • 嵌套的"IO"非常重要.它驱动家庭为什么`IO`是一个真正的类型,而不仅仅是某种杂质标志. (4认同)