我正在做IO monad haskell中的階乘函數。 我跟着例子mod3爲了做IO monad的階乘函數。 我不明白爲什麼我的代碼是錯的。 我想看看n> = 1,然後對n進行階乘。 最後添加到(n,r2)並返回。 任何人都可以幫助理解嗎?IO monad haskell中的階乘函數
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)
你的代碼做了什麼或不做什麼? – crockeea
你能解釋一下你正在努力完成什麼嗎?你爲什麼使用'IORef's? – crockeea
我的代碼是計算一個數字的階乘,例如,事實4,它返回一個列表,(4,24)。 4是用戶給出的數字,24是4! – njkdsaw