functional-programming - orientada - programacion funcional ventajas y desventajas
¿Cómo modelan los lenguajes funcionales los efectos secundarios? (3)
A mi entender, si desea tener efectos secundarios en un lenguaje funcional, debe codificarlos explícitamente.
Dado que los efectos secundarios rompen la transparencia referencial, ¿no van en contra de los lenguajes funcionales?
Existen dos técnicas que utilizan los lenguajes de programación puramente funcionales para modelar los efectos secundarios:
1) Un tipo de mundo que representa un estado externo, donde el sistema de tipos garantiza que cada valor de ese tipo se utilizará una sola vez.
En un lenguaje que utiliza este enfoque, la función print
y read
puede tener los tipos (string, world) -> world
y world -> (string, world)
respectivamente.
Podrían ser utilizados así:
let main w =
let w1 = print ("What''s your name?", w) in
let (str, w2) = read w1 in
let w3 = print ("Your name is " ^ name, w2) in
w3
Pero no así:
let main w =
let w1 = print ("What''s your name?", w) in
let (str, w2) = read w in
let w3 = print ("Your name is " ^ name, w2) in
w3
(porque w se usa dos veces)
Todas las funciones incorporadas con efectos secundarios tomarían y devolverían un valor mundial. Dado que todas las funciones con efectos secundarios están integradas o llaman a otras funciones con efectos secundarios, esto significa que todas las funciones con efectos secundarios deben tomar y devolver un mundo.
De esta manera no es posible llamar una función con efectos secundarios dos veces con los mismos argumentos y no se viola la transparencia referencial.
2) Una mónada IO donde todas las operaciones con efectos secundarios deben ejecutarse dentro de esa mónada.
Con este enfoque, todas las operaciones con efectos secundarios tendrían que escribir io something
. Por ejemplo, print
sería una función con una string -> io unit
tipo string -> io unit
y read
tendría una io string
tipo io string
.
La única forma de acceder al valor de realizar una operación sería usar la operación de "enlace monádico" (llamada >> = en haskell, por ejemplo) con la operación IO como un argumento y una función que describe qué hacer con el resultado como el otro. operando
El ejemplo de arriba se vería así con una IO monádica:
let main =
(print "What''s your name?") >>=
(lambda () -> read >>=
(lambda name -> print ("Your name is " ^ name)))
Hay varias opciones disponibles para manejar la E / S en un lenguaje funcional.
- No seas puro. Muchos lenguajes funcionales no son puramente funcionales. Es más que admiten la programación funcional en lugar de imponerla. Esta es, con mucho, la solución más común al problema de la E / S en la programación funcional. (Ejemplos: Lisp, Scheme, Standard ML, Erlang, etc.)
- Transformación de la corriente. Haskell Early I / O se hizo de esta manera. Revisa mi enlace de abajo para detalles si quieres más información. (Pista: probablemente no lo hagas).
- E / S de paso de continuación (el "paso de mundo" mencionado en otras respuestas). En este, usted pasa una ficha de datos con su E / S que actúa como el "valor diferente" necesario para mantener viva la integridad referencial. Esto es usado por varios dialectos ML si la memoria sirve.
- Lo de "continuación" o "mundo" anterior se puede envolver en varios tipos de datos, el más famoso es el uso de mónadas en este rol en Haskell. Tenga en cuenta que esto es, teóricamente, lo mismo debajo de las cubiertas, pero se elimina el tedio de hacer un seguimiento de las variables de estado "mundo" / "continuación".
Hay una disertación de investigación que analiza exhaustivamente estos.
La E / S funcional es un campo de investigación en curso y existen otros lenguajes que abordan este problema de manera interesante y de manera inteligente. La lógica Hoare se utiliza en algunos lenguajes de investigación. Otros (como Mercury ) utilizan la tipificación de la singularidad . Otros (como Clean ) usan sistemas de efectos . De estos, solo tengo una exposición muy limitada a Mercury, así que no puedo comentar sobre los detalles. Sin embargo, hay un paper que detalla el sistema de E / S de Clean en profundidad si está interesado en esa dirección.