import Data.IORef
facM n = do
accRef <- newIORef 1
nRef <- newIORef n
let go = do {
acc <- readIORef accRef;
n <- readIORef nRef;
writeIORef accRef (acc * n);
writeIORef nRef (n - 1);
if (n > 2) then go else readIORef accRef
}
goТеперь только вопросы по х-ю: 1. Как выглядит идиоматичный луп в таком стиле 2. Есть ли
(
Read more... )
Comments 7
Reply
А дойти до того, что точки с запятой работают -- довольно просто. Были промежуточные варианты разные. См. https://codereview.stackexchange.com/a/283479/16287
Reply
Reply
Reply
А вот тут есть while почти как в C: https://hackage.haskell.org/package/loop-while-1.0.0/docs/Control-Monad-LoopWhile.html
Остается только к телу цикла присобачить декоратор для изменения счетчика.
Reply
Будет так:
facM nn = do
accRef <- newIORef 1
nRef <- newIORef nn
whileM_ ((> 1) <$> readIORef nRef) $ do
modifyIORef accRef (\x -> x * n)
modifyIORef nRef (\x -> x - 1)
readIORef accRef
Reply
Leave a comment