Modelos mentales o metáforas del mundo real para la programación funcional

16

¿Alguien tiene un buen modelo mental o metáfora para la programación funcional que hace referencia a algo en el mundo real?

La programación orientada a objetos intuitivamente tiene sentido para mí. Hay cosas que tienen propiedades y, a veces, también pueden hacer cosas o realizar cálculos sobre sus propiedades (métodos). (Ej: Coche, Forma, Gato).

Llevo la programación funcional de ninguna manera y no estoy interesado en un debate sobre las virtudes de los dos. Solo necesito una metáfora o un modelo mental para trabajar como lo he hecho con la programación orientada a objetos.

¿Cuáles son algunos buenos modelos mentales o metáforas del mundo real para programar en un paradigma funcional? Hay algo acerca de las funciones compuestas de funciones que procesan funciones que lo deja a uno sin un lugar firme para pararse y meditar.

Guido Anselmi
fuente
¿A qué significado concreto de "programación funcional" se refiere, "sin efectos secundarios / declarativos" o "funciones de primera clase / composición de funciones"? ¿O ambos?
Acelerado
Interesante pregunta. Con mi pequeño conocimiento actual y poca experiencia en programación en "programación funcional", no puedo responder significativamente esa pregunta. Si tuviera que adivinar, diría que ambas.
Guido Anselmi
13
El modelo del "mundo real" a menudo se da como una motivación para la programación orientada a objetos. Creo que es un enfoque que finalmente deberías superar, porque los objetos en OOP no siempre deben corresponder a los objetos del mundo real, e incluso cuando lo hacen, la correspondencia a menudo es incompleta; por ejemplo, las relaciones "es-a" no son siempre las mismas. Por otro lado, una vez que dices que quieres un modelo o metáfora para un lenguaje de programación basado en algo del "mundo real", creo que esencialmente te has limitado a esta forma limitada de OOP.
David K
Un modelo mental realmente bueno, si tiene experiencia en el uso de sistemas similares a Unix (o el PowerShell en Windows moderno) es la línea de comandos de shell. No son exactamente lo mismo, ya que las tuberías de shell son técnicamente una programación basada en el flujo en lugar de funcional, pero tienen la misma "sensación" que un programador.
slebetman
1
Además, a medida que aprende lenguajes funcionales, en la programación funcional orientada a objetos se trata como una herramienta, como las expresiones regulares, por ejemplo. Algo que puedes usar si quieres pero no tienes que hacerlo. En algunos idiomas, como lisp y tcl y demás, OO no es una función incorporada en el idioma, sino una biblioteca que puede usar (o incluso puede escribir su propio OO si se siente valiente). Entonces, los problemas que naturalmente tienen una solución OO se pueden resolver usando OO en la mayoría de los lenguajes funcionales. La gente simplemente no trata a OO como una religión.
slebetman

Respuestas:

32

La programación funcional se trata de pegar funciones más pequeñas para lograr sus resultados. Un modelo mental decente (para mí, al menos) es una línea de montaje. Cada función que se compone es un paso más en el proceso de ensamblaje. Considere esta función aquí:

smallest  = head . sort

En Haskell, esta función devolverá el elemento más pequeño de una lista. La línea de ensamblaje primero ordena la entrada, luego devuelve el primer elemento (suponiendo que esté ordenado de menor a mayor). Si solo quisiéramos obtener el valor par más pequeño, entonces podemos cambiar la línea de ensamblaje para que tenga el siguiente aspecto:

smallestEven = head . sort . filter even

Es solo un paso más en la cinta transportadora.

En pocas palabras, las funciones solo describen los pasos tomados para convertir la entrada sin procesar (las partes) en el bien procesado (la salida).

bstamour
fuente
2
En un lenguaje funcional puro sin variables globales, una línea de ensamblaje no puede afectar a la otra (a menos que esté alimentando la entrada de la otra línea). Teóricamente, todas las líneas de ensamblaje que no dependen unas de otras pueden ejecutarse en paralelo, pero no estoy Seguro si algún compilador hace esto.
bstamour
3
@GuidoAnselmi Una forma de pensarlo es que la línea de ensamblaje en la programación funcional construye nuevas salidas mientras deja las entradas intactas, mientras que la línea de ensamblaje en OOP tradicional transforma la entrada.
Doval
2
Esta metáfora solo tiene sentido en el significado de "funciones de primera clase / composición de funciones" de "programación de funciones", no en "sin efectos secundarios / declarativos". Además, la programación orientada a objetos no necesariamente tiene efectos secundarios, por lo que puede implementar una línea de ensamblaje destructiva o constructiva con OOP o este significado de FP. OOP se trata más de encapsulación, transmisión de mensajes y polimorfismo que de efectos secundarios, depende de cómo se modelen las cosas. Por ejemplo, ¿requiere identidad referencial de principio a fin?
Acelerado
3
@bstamour: Para ser precisos, uno debe escribir que (f . g) (x)significa f(g(x))o f . gsignifica \x -> f (g (x)).
Giorgio
3
@MarjanVenema Las cosas fluyen en ese ejemplo solo porque así .es como se define; Así no es como funciona Haskell en general . También podría definir el operador de canalización directa de F # ( |>) en Haskell y escribir smallest x = (sort x) |> heady los datos fluirían correctamente. Solo pensé en señalarlo.
Doval
18

¿Alguien tiene un buen modelo mental para la programación funcional?

Matemáticas. La programación funcional está inspirada y modelada en las matemáticas. Las funciones matemáticas no tienen estado, no tienen efectos secundarios, etc., y lo mismo ocurre con FP. Si piensa en FP en términos de funciones matemáticas en lugar de utilizar un enfoque de "cómo le hago esto a ese" estilo OO, estará en buena forma. Sin embargo, si intentas llevar la sensibilidad OO a FP, estarás nadando contra la corriente.

Caleb
fuente
1
Gracias. Sin embargo, necesito una metáfora del mundo real (por ejemplo, no de computadoras o matemáticas).
Guido Anselmi
3
@GuidoAnselmi: una función es un cuadro negro. Pones algo en un lado y luego sale algo nuevo del otro lado. Si pones las mismas cosas, siempre sacas las mismas cosas. Puede tomar muchas de estas pequeñas cajas y combinarlas en diferentes órdenes para construir una fábrica que pueda incorporar metales en bruto y producir un automóvil. El proceso interno se divide en muchas partes, pero desde afuera es solo otra función.
Daenyth
16

¿Qué tal un libro animado ?

En un libro animado cada página representa el mundo tal como existe en un momento en el tiempo. En nuestro programa, el mundo se representa como una estructura de datos compuesta (por ejemplo, tenemos un plátano que está en la mano de un gorila que está en un árbol que está en una jungla). Cada página posterior avanza la historia modificando ligeramente la representación anterior. En FP, las estructuras de datos persistentes se diseñaron para reutilizar eficientemente las estructuras anteriores de modo que un cambio proporcione solo una representación delta y no completamente nueva.

Lo que puede no ser obvio es que una página en nuestro libro también representaría intangibles. Por ejemplo, si el gorila deja caer el plátano, podríamos comenzar a aplicar los efectos de la gravedad en su decente y aceleración hacia el suelo de la jungla. Para acomodar esto, le atribuiríamos atributos como la velocidad y la trayectoria a nuestro plátano.

En nuestro programa, habría una función que acepta una página de libro animado (también conocido como el estado del mundo) como argumento y genera una nueva página . De esta manera, nuestra historia se cuenta sin cambiar realmente el estado de los objetos existentes. Simplemente reemplazamos cada página con una nueva usando lo que efectivamente es un cálculo.

Mario T. Lanza
fuente
3

Relaciones

Amigo: Dadas dos personas, una relación de amigo sigue estas leyes generales

  1. Tener buena voluntad el uno hacia el otro
  2. Piensan que son amigos para ellos (por lo tanto, las leyes deben ser cumplidas por ambos miembros en esta relación)
  3. Disfruta pasar tiempo juntos

Monoide: dados múltiples elementos y una función que toma 2 de los elementos y devuelve 1, una relación monoidal sigue estas leyes generales

  1. Hay uno de esos elementos (solo uno, llamado identidad) que se pasa a la función con cualquier otro elemento asegurará que la función siempre devuelva el otro elemento (0 + 1 = 1, por lo tanto 0 es la identidad cuando los elementos son números y el la función es la suma)
  2. La función no puede operar o devolver artículos que no están en el conjunto con el que tiene una relación monoidal
  3. La función es asociativa y se puede usar con los elementos de una manera un tanto independiente del orden, esto significa a * (b * c) = (a * b) * c que dice que puede multiplicar a por el resultado de b * c o c por el resultado de a * b y el resultado será el mismo que hagas primero.

La programación funcional tiene que ver con generalizaciones, amigo es una relación muy general que se puede ver en numerosos escenarios, pero en todos los diversos formatos generalmente sigue las leyes anteriores.

Al reconocer las leyes que rigen las relaciones entre las cosas, puede crear implementaciones generales que funcionen en cualquier formato de cosas que tengan ese tipo de relación. En la programación funcional, intenta identificar las relaciones entre las cosas para que puedan clasificarse y tratarse en general.

¿Quieres una metáfora del mundo real? Observe cómo se relacionan las cosas e intente identificar las leyes generales (como en el caso de múltiples escenarios en los que pueden variar otras cosas además de las leyes). Existe una relación entre un empleado de registro y un comprador en una tienda, tiene algunas leyes generales, el software ha sido desarrollado para facilitar los objetivos de las personas en esa relación general en la forma de los sistemas POS. Del mismo modo, cuando comienza a ver estas leyes generales que dictan cómo se relacionan las cosas, puede comenzar a confiar en las leyes de esas relaciones al escribir su software en lugar de los detalles específicos de una instancia de una relación.

Jimmy Hoffa
fuente
2

Todo es un valor, y aplica funciones a los valores (que pueden ser funciones) para producir nuevos valores, preferiblemente sin producir efectos secundarios.

Doval
fuente
Gracias. Desafortunadamente, eso suena más como una descripción que como un modelo mental o metáfora. Necesito una metáfora del mundo real (no de las computadoras).
Guido Anselmi
1
Como señala Caleb , la programación funcional modela las matemáticas, no el mundo real. Puede modelar el mundo real a través de la lente de las matemáticas, pero es probable que no encuentre una metáfora que lo satisfaga, porque FP evita el concepto de cosas con una identidad persistente y un estado mutable. Si lo desea, puedo señalar cómo OOP construye el mapa a FP, pero esa todavía no será la respuesta que desea.
Doval
Pero las matemáticas se basan en el mundo real. 1 sol, 9 planetas. 2 manzanas más 2 manzanas hacen cuatro manzanas.
Guido Anselmi
Y en la programación funcional también puede tener un tipo para soles, planetas y manzanas, luego crear un valor de tipo sol, 9 valores de tipo planeta y definir la suma para el tipo de manzana.
Doval
3
@GuidoAnselmi lo tienes completamente al revés, la gente analiza el mundo real con las matemáticas, no tiene base en el mundo real. Las matemáticas se utilizan para analizar y definir relaciones entre todo tipo de cosas, reales y no. 9 planetas está aplicando una construcción matemática (el conjunto de números naturales) a una construcción del mundo real (planetas) con una función de análisis matemático (conteo). El mundo real no tiene 9 planetas, tiene lo que tiene, las matemáticas simplemente hablan de representaciones simbólicas de cosas en las que los símbolos tienen relaciones entre sí.
Jimmy Hoffa
1

La cosa clave a tener en cuenta sobre la programación funcional es que todo es un valor, incluso el código en sí mismo es 'valores'.

El mejor ejemplo de un entorno de programación funcional simple es la herramienta de negocios favorita de todos: la hoja de cálculo. Cada celda de la hoja de cálculo son datos o el resultado de una función. Además, esta función no puede activarse y modificar otra celda.

Cuando uno se mueve a un lenguaje funcional, en lugar de una cuadrícula cartesiana de A1y B42, las funciones tienen nombres. Eso es todo lo que realmente es.

Hay otros aspectos que se pueden agregar más allá de esto ... pero esa es la programación funcional en su núcleo. No hay que preocuparse por la estructura de las listas o la agrupación de cosas. La programación funcional se trata de pasar un valor a una función y recuperar un valor sin tener que molestar en ningún otro lugar de la memoria.

Eso es. La programación funcional es una hoja de cálculo con nombres en lugar de una cuadrícula.


fuente
0

Puedes pensar en la programación funcional como en comportamientos . Un programa es una descripción del comportamiento que desea que la computadora promulgue. Las funciones son la unidad básica de comportamiento, y la composición de funciones es una forma de construir comportamientos más grandes a partir de los más pequeños.

En OOP, un objeto de código está destinado a ser el estado de un objeto en el dominio del problema; cambia con el tiempo para reflejar los cambios en ese objeto de dominio. En FP, un valor representa el estado de un objeto de dominio; nunca cambia, simplemente crea diferentes valores para representar diferentes estados.

Encuentro que el modelo funcional es un poco más honesto sobre lo que las computadoras realmente están haciendo: representar. Después de todo, no puedo simplemente evocar un new Tesla()aire de la nada. :)

Jon Purdy
fuente
-5

Las oraciones son más funcionales que orientadas a objetos, suponiendo que las descomponga más o menos de la siguiente manera ...

The brown cow is in the meadow across the deep river.

Entonces necesitamos encontrar las frases principales y luego el resto:

The cow (brown)
the meadow (across)
the river (deep)

En una ida:

sentence: The cow ((the meadow (the river (deep)) (across)) brown)

Árbol de Parse:

|                     sentence
|                      /         
|                  The cow
|                 /       \
|            the meadow   brown
|            /         \
|      the river      across
|              \
|              deep

La parsimonia infecta el pensamiento funcional;

Me quito el sombrero ante Gottlieb Frege 1890, Alan Turing (entschiedungsprobleme) 1930, Noam Chomsky (1960).

KTys
fuente
44
Esta es una explicación confusa, y estoy familiarizado con FP para empezar.
Daenyth
Parece que imita la forma de Lisp sin entender el significado
Izkata