Haskell utiliza ámbitos anidados estáticos. Lo que es un poco confuso en comparación con otros lenguajes que tienen ámbitos anidados estáticos es que el alcance de un nombre es un bloque que incluye pruebas que preceden a su definición. Por ejemplo
evens = 0 : map (+1) odds
odds = map : (+1) evens
aquí el nombre de 'probabilidades' está en el ámbito de la definición de 'iguala', a pesar del hecho sorprendente de que 'odds' aún no ha sido definida. (El ejemplo define dos listas infinitas de números pares e impares).
Un lenguaje inactivo con una regla de ámbito similar era Modula-3. Pero Haskell es un poco más complicado en el sentido de que puede intentar 'redefinir' una variable dentro del mismo ámbito, pero en su lugar, simplemente introduce otra ecuación de recursión. Esta es una trampa para la gente que aprendió LD o el Esquema primera:
let x = 2 * n
x = x + 1 -- watch out!
Esto es perfectamente buena LD o el Esquema dejó *, pero tiene Haskel esquema letrec semántica, sin la restricción a los valores de lambda. ¡No es de extrañar que esto sea algo complicado!
Por cierto, Sev, es posible que desee volver a considerar si usted todavía quiere mantener la respuesta de igorgue como la aceptada para esta pregunta, ya que se ha demostrado equivocado en el punto de aliasing (ver el responda abajo) y, aunque hay argumentos al respecto, no puede encontrar ningún argumento de que no esté equivocado en el punto de las variables. –