【发布时间】:2015-10-22 01:41:11
【问题描述】:
我在 IO monad haskell 中做阶乘函数。 我按照示例 mod3 使用 IO monad 执行阶乘函数。 我不明白为什么我的代码是错误的。 我想看看n>=1,然后对n做阶乘。 最后添加到 (n,r2) 并返回。 谁能帮忙理解一下?
while :: IO Bool -> IO () -> IO ()
while test body =
do b <- test
if b
then do {body ; while test body} -- same-line syntax for do
else return ()
-- remainder when integer-dividing n by 3
mod3 :: Integer -> IO Integer
mod3 n = do r <- newIORef n
while
(do {v <- readIORef r; return (v >= 3)})
(do {v <- readIORef r; writeIORef r (v-3)})
readIORef r
-- ghci> fact 4
-- (4,24)
fact :: Integer -> IO (Integer, Integer)
fact n = do r2 <- newIORef n
while
(do {v2 <- readIORef r2; return (v2 >= 1)})
(do {v2 <- readIORef r2; writeIORef r2 (v2*fact(v2-1))})
readIORef (n,r2)
【问题讨论】:
-
你的代码做什么或不做什么?
-
你能解释一下你想要完成什么吗?你为什么使用
IORefs? -
我的代码是计算一个数字的阶乘,例如事实 4,它返回一个列表 (4,24)。 4是给用户的数字,24是4!