【发布时间】:2013-10-05 16:42:31
【问题描述】:
我在 Haskell 中编写了以下代码:
import Data.IORef
import Control.Monad
import Control.Monad.Trans.Cont
import Control.Monad.IO.Class
fac n = do
i<-newIORef 1
f<-newIORef 1
replicateM_ n $ do
ri<-readIORef i
modifyIORef f (\x->x*ri)
modifyIORef i (+1)
readIORef f
这是非常好的代码,它将阶乘实现为命令式函数。但是 replicateM_ 不能完全模拟真实 for 循环的使用。所以我尝试使用延续来创建一些东西,但我失败了,这是我的代码:
ff = (`runContT` id) $ do
callCC $ \exit1 -> do
liftIO $ do
i<-newIORef 1
f<-newIORef 1
callCC $ \exit2 -> do
liftIO $ do
ri<-readIORef i
modifyIORef (\x->x*ri)
modifyIORef i (+1)
rri<-readIORef i
when (rri<=n) $ exit2(())
liftIO $ do
rf<-readIORef f
return rf
你能帮我更正我的代码吗? 谢谢
【问题讨论】:
-
只是为了确保:您是尝试 IORef 和延续的高级用户,还是需要有关如何以命令式样式编写阶乘函数的建议的初学者?
-
但是...为什么yyyy?
-
@kqr 我是初学者。
-
你想要来自
Control.Monad的forM_。 -
@Dragno 你被误导了。
replicateM不会多次复制代码。此外,即使您使用replicateM的代码也让我想知道,“为什么?”。如果您允许,事情会变得非常简单。
标签: haskell continuations monad-transformers