Почему этот код использует теневые привязки `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, все xs относятся к одной и той же привязке, ни одна не относится к внешней x = 4 связывание.

Другие вопросы по тегам