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
コードの修正を手伝ってもらえますか? ありがとう