Почему этот код использует теневые привязки `let`?
Запуск этого кода:
j = let x = 4
in let x = x * x
in x
в переводчике:
ghci> j
... no response ...
зависает с очень небольшим использованием процессора. Почему это? Я ожидал j = 16
,
1 ответ
Решение
Согласно отчету Haskell, раздел 3.12:
Пусть выражения имеют общий вид let { d1; …; dn } в e и представляет вложенный взаимно-рекурсивный список объявлений с лексической областью действия (в других языках let часто называют letrec). Объем объявлений - это выражение e и правая часть объявлений.
(акцент мой)
Так во втором let
, где x = x * x
, все x
s относятся к одной и той же привязке, ни одна не относится к внешней x = 4
связывание.