Здравствуйте, neFormal, Вы писали:
EP>>Например в Haskell есть ST Monad, которая в определённом смысле позволяет мутировать локальные переменные в ограниченной области видимости, при этом возвращая чистый результат. Конечно неудобно, через многоэтажные замыкания (скрытые под синтаксических сахаром do), но всё же позволяет.
F>монады — это боль хаскелекода.не дай б-г ты вляпался в одну из них. и всё. тяни её до самого верха.
Это если какая-нибудь IO. В случае с ST есть
runST — таким образом как раз реализуется сценарий "внутри функции мутации локальных переменных, а наружу выдаётся чистый немонадный результат".
F>так что я не соглашусь. там ты мутируешь не столько локальные переменные, сколько целую ветку ф-ций и вычислений.
Вот пример:
sumST :: Num a => [a] -> a
sumST xs = runST $ do -- runST takes out stateful code and makes it pure again.
n <- newSTRef 0 -- Create an STRef (place in memory to store values)
forM_ xs $ \x -> do -- For each element of xs ..
modifySTRef n (+x) -- add it to what we have in n.
readSTRef n -- read the value of n, and return it.
Здесь мутируется как раз "локальная переменная", а не ветка функций.