Я играл с монадой State и не знаю, что вызывает стек переполнение в этом простом фрагменте кода.
import Control.Monad.State.Lazy
tick :: State Int Int
tick = do n <- get
put $! (n+1)
return n
million :: Int
million = snd $ runState (mapM_ (const tick) [1..1000000]) 0
main = print million
Примечание Я просто хотел бы знать, что вызывает проблему в этом фрагменте кода, сама задача не важна сама по себе.