haskell language-agnostic lisp paradigms

haskell - ¿Qué significa "puro" en el contexto de lenguajes de programación y paradigmas?



language-agnostic lisp (2)

En otras palabras, lo que hace que un lenguaje puro?

Por ejemplo, Smalltalk se considera un lenguaje puramente orientado a objetos. Se puede decir que Haskell y Lisp son lenguajes puramente funcionales.

Cuando decimos puro, ¿significa eso que no son capaces de otros paradigmas de programación (que está lejos de la verdad) o significa que fueron diseñados para ser usados ​​en ese paradigma "puramente" X?


La palabra "puro" en el lenguaje funcional es posiblemente "Sin Estado", la salida no depende de los estados.

Para los idiomas imperativos, asigna x: = 0, pero puede reasignar el valor de la variable x más adelante. El valor de x depende del estado actual.

Pero para lenguajes puramente funcionales, si f (x) = 1, entonces el resultado siempre será 1.


La palabra pura tiene diferentes significados en diferentes contextos.

Programación Funcional

Cuando la gente habla de que Haskell es un lenguaje puro, significa que tiene transparencia referencial . Es decir, puede reemplazar cualquier expresión con su valor sin cambiar el significado del programa. Por ejemplo, en Haskell:

square :: Int -> Int square x = x * x main = print (square 4)

La expresión square 4 puede reemplazarse con su valor (16) sin cambiar el significado del programa. Por otro lado, en este código de Java:

public int square(int x) { System.out.println("Done!"); return (x*x); } public static void main(String [] args) { System.out.println(square(4)); }

no puede reemplazar el square(4) con su valor (16) porque cambiaría el significado del programa, ya no imprimirá Done! al stdout. En Haskell es imposible que las funciones tengan efectos secundarios como imprimir en la salida estándar o cambiar las ubicaciones de la memoria, por lo que se aplica la transparencia referencial.

Tenga en cuenta que con este significado de puro, Lisp no es un lenguaje funcional puro, ya que sus funciones pueden tener efectos secundarios (si desea ser exigente, Haskell no es un lenguaje funcional puro debido a la existencia de unsafePerformIO , pero todos saben que estás destinado a uno de los círculos más desagradables del infierno si alguna vez usas esa función).

Por supuesto, siempre es posible adoptar un estilo puro en un lenguaje impuro, y muchos programadores lo harán para facilitar el razonamiento sobre sus programas. Es solo que la transparencia referencial no es impuesta por el compilador, como lo es en un lenguaje puro.

Ejemplos de lenguajes puramente funcionales incluyen Haskell , Clean y Miranda . Ejemplos de lenguajes funcionales impuros incluyen OCaml , F# y Scheme .

Programación orientada a objetos

Cuando las personas hablan de que Smalltalk o Ruby son un lenguaje puramente orientado a objetos, significan que no hay distinción entre objetos y valores primitivos. En Smalltalk y Ruby, los valores como enteros, booleanos y caracteres también son objetos, en el sentido de que pueden recibir mensajes (Smalltalk) o tener métodos (Ruby). Por ejemplo, puedes hacer

1.to_s

en Ruby, es decir, llame al método del entero 1 que lo convierte en una cadena. Compare esto con un lenguaje OO ''impuro'' como Java, en el que hay objetos (que son instancias de clases y pueden tener métodos, etc.) y valores primitivos (por ejemplo, int , double , bool , que no pueden tener métodos).

Cuando un lenguaje OO es puro, la gente suele decir que "todo es un objeto", lo que no es estrictamente cierto (por ejemplo, una sentencia if no es un objeto), pero es cierto para decir que "todo valor es un objeto". ".

Ejemplos de lenguajes orientados a objetos puros incluyen Ruby y Smalltalk . Ejemplos de lenguajes orientados a objetos impuros incluyen Java y C++ .