Haskell использует статические вложенные области видимости. Что немного запутанно по сравнению с другими языками, которые имеют статические вложенные области видимости, так это то, что область действия имени - это блок, который включает тесты, предшествующие его определению . Например
evens = 0 : map (+1) odds
odds = map : (+1) evens
здесь название «шансы» находится в области действия в определении «четности», несмотря на удивительный факт, что «шансы» еще не определены. (В примере определены два бесконечных списка четных и нечетных чисел.)
Мёртвым языком с похожим правилом определения была Модула-3. Но Haskell немного хитрее, поскольку вы можете попытаться «переопределить» переменную в той же области видимости, но вместо этого вы просто вводите другое уравнение рекурсии. Это ловушка для людей, которые сначала изучили ОД или Схему:
let x = 2 * n
x = x + 1 -- watch out!
Это отлично подходит для ML или Scheme let *, но у Haskel есть семантика letrec схемы, без ограничения лямбда-значениями. Неудивительно, что это хитрая штука!