0

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

コードの修正を手伝ってもらえますか? ありがとう

4

1 に答える 1