Haskell реализован без стека?

from Как работает бесуровневый язык?

Haskell (as commonly implemented) does not have a call stack; 
evaluation is based on graph reduction.

Действительно? Это интересно, потому что, хотя я никогда не испытывал этого сам, я читал, что если вы не используете строгие версии функций fold, а затем заставляете оценивать бесконечную складку, вы получаете переполнение стека. Несомненно, это указывает на наличие стека. Может ли кто-нибудь уточнить?

Ответ 1

Я никоим образом не специалист по этому вопросу, но я думаю, что ответ, который вы процитировали, не совсем точно. У Haskell нет простого типа стека, который имеет самые императивные языки, где вы можете проследить путь вызовов через программу. Из-за своей лень оценка основана на сокращении графика, о котором вы можете прочитать здесь, но вызовы по-прежнему в конечном итоге помещаются в стек. Согласно этой странице, "стек" в механизме выполнения GHC мало похож на стек лексических вызовов". Так что да, есть стек, но он очень отличается от того, который вы найдете на императивном языке, и он создается с помощью сокращения графика.

Ответ 2

Haskell не является "безплатным" или что-то в этом роде. Код, созданный из источника Haskell, по-прежнему имеет какие-то символы, а выполнение показывает несколько стеков, но они очень слабо связаны с исходным кодом. Вот некоторая информация о попытках упростить отладку/трассировку/профилирование:

http://www.haskell.org/wikiupload/9/9f/HIW2011-Talk-Marlow.pdf