Я играл с государственной монадой, и я не знаю, что вызывает переполнение стека в этой простой части кода.
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
Примечание Я просто хотел бы знать, что вызывает проблему в этом фрагменте кода, сама задача не важна сама по себе.