variables haskell immutability monads referential-transparency

¿Tiene Haskell variables?



immutability monads (5)

Haskell tiene variables inmutables (variables en el sentido matemático) por defecto:

foo x y = x + y * 2

Por defecto, las variables no son celdas mutables .

Haskell también tiene células mutables, pero las habilitas explícitamente:

> v <- newIORef 0 > readIORef v 0 > writeIORef v 7 > readIORef v 7

Entonces, Haskell tiene variables verdaderas. Pero no usa variables mutables por defecto.

He oído muchas veces que Haskell no tiene variables; en particular, esta respuesta afirma que no, y se votó al menos nueve veces y se aceptó.

Entonces, ¿tiene variables o no, y por qué?

Esta pregunta también parece aplicar ML, F #, OCaml, Erlang, Oz, Lava y todos los idiomas intermedios de la SSA .


La respuesta simple es: sí, Haskell tiene variables como se define en la Sección 3.2 del Informe Haskell . Las variables pueden aparecer en patrones y, por lo tanto, pueden vincularse a un valor utilizando construcciones como let , case y list comprehensions.

Quizás implícita en sus preguntas es si una variable se llama correctamente una variable si es inmutable. Creo que las otras respuestas cubren la mutabilidad lo suficiente.


Sí, Haskell tiene variables. Considere las definiciones (esencialmente equivalentes)

inc n = n + 1 inc = /n -> n + 1

En ambos casos, n es una variable; tomará diferentes valores en diferentes momentos. El Informe Haskell , en la Sección 3 se refiere explícitamente a estas variables.

Que aquí hay una variable puede ser más fácil de ver si consideramos el siguiente programa completo:

inc n = n + 1 f = inc 0 g = inc 1 main = print (f+g)

La respuesta impresa será "3", por supuesto. Al evaluar f , a medida que expandimos, inc x tomará el valor 0 , y cuando más tarde (¡o antes!) Evalúe g , a medida que expandimos inc x tomará el valor 1 .

Es posible que haya surgido cierta confusión porque Haskell, como ocurre con los otros idiomas enumerados en la pregunta, es un lenguaje de asignación única: no permite la reasignación de variables dentro de un alcance. Una vez que a n se le ha asignado el valor 42 , no puede ser otra cosa que 42 sin introducir un nuevo ámbito con una nueva n (que es una variable diferente, sombreando a la otra n ) unida a otro valor.

Esto puede no ser del todo obvio en algunos contextos, como las expresiones que usan do :

do let n = 1 print n let n = 2 print n

pero si elimina el azúcar sintáctico, convirtiéndolo en Haskell sin el do , queda claro que se creó un nuevo ámbito anidado donde n en ese ámbito interno es una variable diferente que está sombreando el n en el ámbito externo:

(let n = 1 in (print n >> (let n = 2 in print n)))


Según [Wikipedia] ( http://en.wikipedia.org/wiki/Variable_(programming)) , sí, Haskell tiene variables:

En la programación de computadoras, una variable es un identificador (generalmente una letra o palabra) que está vinculado a un valor almacenado en la memoria del sistema o una expresión que puede evaluarse. Por ejemplo, una variable puede llamarse "total_count" y contener un número.
En los lenguajes de programación imperativos, generalmente se puede acceder o cambiar los valores en cualquier momento. Sin embargo, en los lenguajes funcionales y lógicos puros, las variables se vinculan a expresiones y mantienen un único valor durante toda su vida útil debido a los requisitos de transparencia referencial. En los lenguajes imperativos, el mismo comportamiento se exhibe por las constantes, que generalmente se contrastan con las variables normales.

No es que todas las definiciones de Wikipedia sean perfectamente confiables, por supuesto.

La página sobre [variables matemáticas] ( http://en.wikipedia.org/wiki/Variable_(mathematics)) puede proporcionar una mayor comprensión de esto.


"He oído que Haskell no tiene variables. ¿Es cierto?"

No

"Entonces, ¿tiene variables o no, y por qué?"

No

EDITAR: Mi respuesta causa un doble negativo, que es naturalmente confuso porque la pregunta principal es positiva mientras que el cuerpo no. :)

EDIT2: Editado de nuevo, ya que el OP cambió la pregunta.