Прекрасный синтаксис-2

Feb 22, 2023 07:46


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... )

вопрос залу, fp, programming

Leave a comment

Comments 7

aklepatc February 22 2023, 13:42:02 UTC
Теперь вы расскажите, как вам удалось это сверстать (в смысле код).

Reply

nponeccop February 22 2023, 14:42:41 UTC
В смысле "сверстать"? форматирование - pre в старой версии редактора.

А дойти до того, что точки с запятой работают -- довольно просто. Были промежуточные варианты разные. См. https://codereview.stackexchange.com/a/283479/16287

Reply

aklepatc February 22 2023, 14:48:41 UTC
Вы, вроде бы, говорили, что у вас нет доступа к старой версии редактора.

Reply

nponeccop February 22 2023, 18:23:44 UTC
Мне тут в комментариях к предыдущему посту помогли включить https://nponeccop.livejournal.com/719366.html

Reply


boroda February 22 2023, 18:36:25 UTC

А вот тут есть while почти как в C: https://hackage.haskell.org/package/loop-while-1.0.0/docs/Control-Monad-LoopWhile.html

Остается только к телу цикла присобачить декоратор для изменения счетчика.

Reply

nponeccop February 22 2023, 19:52:29 UTC
Это неправильная либа. Правильная вот https://www.stackage.org/haddock/lts-20.11/monad-loops-0.4.3/src/Control.Monad.Loops.html#whileM_

Будет так:
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

Up