Pregunta

Con frecuencia he escuchado afirmaciones de que Haskell no tiene variables;En particular, esta respuesta afirma que no es así, y fue votado a favor al menos nueve veces y aceptado.

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

Esta pregunta también parece aplicarse a ML, F#, OCaml, Erlang, Oz, Lava y todos SSA lenguas intermedias.

¿Fue útil?

Solución

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

 foo x y = x + y * 2

Por defecto las variables no son células mutables .

Haskell también tiene células mutables sin embargo, pero que les permiten explícitamente:

 > import Data.IORef (newIORef, readIORef, writeIORef)
 > v <- newIORef 0
 > readIORef v
 0

 > writeIORef v 7
 > readIORef v
 7

Por lo tanto, YES Haskell tiene verdaderas variables. Pero no utiliza las variables mutables por defecto.

Otros consejos

La simple respuesta es: sí, Haskell tiene variables como se define en la sección 3.2 del la Haskell Informe. Las variables pueden aparecer en los patrones y por lo tanto puede estar unido a un valor usando construcciones como let, case, y listas por comprensión.

Tal vez implícita en sus preguntas es si una variable es una variable llamada apropiadamente si es inmutable. Creo que las otras respuestas cubren suficientemente la mutabilidad.

Sí, Haskell tiene variables. Tenga en cuenta las definiciones (esencialmente equivalentes)

inc n = n + 1
inc = \n -> n + 1

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

Eso n que aquí hay una variable puede ser más fácil para ver si tenemos en cuenta lo siguiente programa completo:

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

La respuesta será impreso "3", por supuesto. Al evaluar f, a medida que ampliamos inc x asumirá el valor 0, y cuando después (o antes!) La evaluación de g, a medida que ampliamos inc x tomará el valor 1.

Algunos confusión puede haber surgido porque Haskell, al igual que con los otros idiomas de la cuestión, es un lenguaje de una sola misión: que no permite la reasignación de variables dentro de un ámbito. Una vez n se ha asignado el 42 valor, no puede ser cualquier cosa, pero 42 sin introducir un nuevo ámbito de aplicación con un nuevo n (que es una variable diferente, que cubrían el otro n) unido a otro valor.

Esto puede no ser del todo evidente, en algunos contextos, como expresiones usando do:

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

pero si se quita el azúcar sintáctico, traduciéndola en Haskell sin la do, se hace evidente que había un nuevo, el alcance anidado creado donde el n en ese ámbito interno es una variable diferente que se cubrían el n en el exterior alcance:

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

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

No.

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

Sí.

EDITAR:Mi respuesta provoca una doble negativa, lo que naturalmente resulta confuso porque la pregunta principal es positiva mientras que el cuerpo no lo es.:)

EDITAR2:Editado nuevamente, ya que el OP cambió la pregunta.

De acuerdo con [Wikipedia] ( http://en.wikipedia.org/wiki / Variable_ (programación)) , sí, Haskell tiene variables:

En la programación de computadoras, una variable es un identificador (por lo general una letra o palabra) que está vinculado a un valor almacenado en la memoria del sistema o una expresión que se puede evaluar. Por ejemplo, una variable que se podría llamar "TOTAL_COUNT" y contiene un número.
En los lenguajes de programación imperativa, valores generalmente se puede acceder o cambiar en cualquier momento. Sin embargo, en los lenguajes funcionales y lógicas puras, las variables están obligados a expresiones y mantener un único valor durante toda su vida debido a las exigencias de transparencia referencial. En los lenguajes imperativos, el mismo comportamiento es exhibido por las constantes, que por lo general se contrastan con las variables normales.

No es que todas las definiciones de Wikipedia son perfectamente digno de confianza, por supuesto.

La página en [variables matemáticas] ( http://en.wikipedia.org / wiki / Variable_ (matemáticas)) puede proporcionar más información sobre esto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top