今天我试图加深对IO monad的理解,我尝试编写一个函数,该函数采用Int
n
并返回IO Bool
而不是True
} n
次,然后永远False
。
trueThenFalse :: Int -> IO Bool
通常情况下,我会通过递归解决类似这样的问题,但是这里似乎没有任何可以递归的内容。
我将如何实现此功能?这样做是否可能和/或可取?
答案 0 :(得分:6)
作为IO (IO Bool)
可能更有意义,因为你必须首先建立一些州:
trueThenFalse n = do
holder <- newMVar n
return (modifyMVar holder (\ k -> return (k - 1, k > 0)))
创建一个可变的持有者来存储多少个“遗骸”的计数,并返回另一个可以多次运行的IO
操作,修改计数并返回True
如果计数是&gt; 0