Рассмотрим следующую программу. Он работает вечно и не делает ничего полезного, но потребление памяти в ghci постоянное:
--NoExplode.hs
module Main (main) where
test :: [Int] -> IO()
test lst = do
print "test"
rList lst
rList :: [Int] -> IO ()
rList [] = return ()
rList (x:xs) = do
rList xs
main = do
test [1..]
Теперь рассмотрим следующий тривиально модифицированный вариант выше. Когда эта программа запускается в ghci, память взрывается. Единственное отличие состоит в том, что print "test"
теперь назначается x
в блоке do
test
.
--Explode.hs
module Main (main) where
test :: [Int] -> IO()
test lst = do
x <- print "test"
rList lst
rList :: [Int] -> IO ()
rList [] = return ()
rList (x:xs) = do
rList xs
main = do
test [1..]
Почему изменение print "test"
до x <- print "test"
приводит к взрыву ghci?
p.s. Я натолкнулся на это, пытаясь понять Взрыв памяти при написании ленивой байтовой строки в файл в ghci, и проблема там (я думаю) существенно отличается от вышеизложенного. Благодаря