Haskell реализован без стека? - PullRequest
10 голосов
/ 17 ноября 2011

из Как работает язык без стеков?

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

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

Ответы [ 2 ]

8 голосов
/ 17 ноября 2011

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

1 голос
/ 17 ноября 2011

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

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

...