¿Cuáles son algunos conceptos en el cálculo lambda que es bueno saber antes de aprender programación funcional?

Dependiendo de las circunstancias, al menos dos de

  • Codificación de la iglesia
  • Evaluación normal / aplicativa / perezosa
  • Conversión Eta
  • Todo lo demás

Si está haciendo un estilo funcional en un lenguaje no funcional (o no muy funcional), los dos primeros son útiles. En lenguajes funcionales, al menos los primeros 3 son importantes.

Codificación de la iglesia

Lo primero que los educadores suelen tratar de explicar a las personas con experiencia en codificación imperativa es que las funciones pueden tratarse como valores. Pero los valores pueden ser tratados como funciones. Es un concepto más difícil de entender para la mayoría de las personas, pero tiene un gran potencial para transformar la forma en que escribes el código. Incluso si impide que las personas pasen valores booleanos, eso es un comienzo .

Estrategias de evaluación

Si tiene el lujo de usar un lenguaje que le da una opción, debe comprender las ventajas y desventajas. Si está atrapado con un lenguaje ansioso e imperativo, necesita saber cómo eso lo limita

Conversión Eta

  • Generalmente útil para poder razonar sobre cómo puede simplificar o extender una función sin cambiar su naturaleza esencial …
  • … lo que también te ayuda a razonar sobre el estilo sin puntos.
  • Comprenderlo ayuda a tratar algunos problemas obtusos en varios lenguajes funcionales (problemas de rendimiento en Haskell, problemas de inferencia de tipos en SML, comportamiento de funciones y métodos en Scala).

¡Todo ello!

Creo que la respuesta de Dmitry es fundamentalmente incorrecta. El cálculo de Lambda no es una mera preocupación académica cuando se utilizan lenguajes funcionales reales.

  • Los compiladores usan alguna versión del mismo como un paso de compilación intermedio.
  • Se usa en optimización
  • Aparece en partes significativas de la sintaxis.

¡En Lisp / Scheme prácticamente estás escribiendo directamente en él!

El cálculo de Lambda lo ayuda a comprender por qué los idiomas son, razonar sobre cómo usarlos de manera efectiva, razonar sobre cómo refactorizar su código. Puede aportar un valor práctico y diario.

Para mí, aprender que era una serie regular de momentos de bombilla: “¡Dios mío, por eso X es una cosa, así es como funciona Y!” Seguí teniendo que dejar el libro mientras digería cada revelación.

Ninguna. El cálculo de Lambda es un tema que se puede ajustar en una página de texto. Es como preguntar “¿cuáles son algunos conceptos de sumar números naturales que es bueno saber antes de aprender idiomas imperativos?” Hay un par de conceptos, como “la función es un valor que puede pasar a otra función, y puede construir mucho”. “, pero estas cosas las aprenderás de todos modos con cualquier lenguaje funcional, por lo que no necesitas sumergirte profundamente en el cálculo lambda antes de eso, no hay mucha profundidad para una inmersión.

Hay cosas interesantes como el combinador Y y los combinadores S, K, I, pero realmente no los necesitas antes de aprender FP. Y probablemente los encontrará allí de todos modos (los métodos de aplicación aplicadores para “(-> a)“ son básicamente combinadores S y K).

Tanto el cálculo Lambda como el álgebra combinatoria son computacionalmente completos y [por el bien de los matemáticos que trabajan con ellos] sintácticamente mínimos. Entonces, estos sistemas algebraicos nos pueden decir algo sobre los elementos esenciales de la informática. LISP no utiliza asignaciones ni procedimientos ni constantes, pero sí utiliza variables y son las únicas primitivas. Esto nos dice que la mayoría de la maquinaria que se ve en los lenguajes de programación es innecesaria, la mayoría de las estructuras de programación se proporcionan solo por conveniencia y eficiencia. Si disculpamos las primitivas de LISP [CAR, CDR, CONS, …], cualquier cálculo puede programarse sin SET, DEFUN o PROG. Por otro lado, las primitivas del álgebra combinatoria son constantes; y así demuestra que las variables no son necesarias [si tenemos un conjunto completo de constantes].

Una presentación concisa del cálculo Lambda para los lectores de mi texto, “LISP Lore and Logic: An Algebraic View of LISP Programming, Foundations, and Applications”, se ofrece en el capítulo 7 [aproximadamente 13 páginas]. El texto está disponible gratis en Internet. También recomiendo “Estructura e interpretación de programas de computadora” por Abelson y Sussman.

Enseñé LISP en UT Austin, Bell Labs y USF por más de 30 años. A menudo siguió un curso de teoría de la recursión [del texto de Hartley Rogers]. Trabajando desde una comprensión de la teoría matemática computacional, pude cubrir algunos de los poderes más fantásticos vistos en LISP [por ejemplo, el combinador Y, programas que se reescriben a sí mismos mientras parecen hacer algo mundano, el problema de detención]. Esta era mi forma de tratar de estar a la altura de la legendaria “Hora mágica” del profesor John McCarthy en el MIT.

Una vez que se le preguntó al profesor McCarthy “si un intérprete y compilador de LISP se puede escribir en C, entonces, ¿cómo puede ser que LISP sea más poderoso que C?”, Respondió que el Teorema de punto fijo [casi increíble] de Kleene para funciones computables obviamente se encuentra en LISP. Proporcionó un ejemplo muy sintáctico en

((LAMBDA (X) (LISTA X (LISTA (COTIZACIÓN COTIZACIÓN) X)))
(COTIZACIÓN (LAMBDA (X) (LISTA X (LISTA (COTIZACIÓN COTIZACIÓN) X)))

que se evalúa a sí mismo! Otros ejemplos fueron lo que el estudiante estaba pidiendo, pero los expertos apreciarían este.

More Interesting

¿Resolver acertijos me hará mejor en matemáticas, física, informática o resolución general de problemas?

¿Cómo puedo calcular los fallos de página a partir de la cadena de referencia y los marcos disponibles?

¿Las funciones del tipo x ^ 2, x ^ 3, x ^ n se consideran de naturaleza recursiva?

Soy un desarrollador, pero me falta mi habilidad matemática. Con un BSc en CS y un MSc en IS, ¿qué debo saber y cómo puedo identificar dónde necesito ayuda?

¿Qué significa definir una variable en matemáticas?

¿Las matemáticas son importantes en la programación?

¿Cuál es el significado del lema de aislamiento?

Cómo detectar un ciclo en un gráfico dirigido

¿La función de módulo es distributiva, asociativa o conmutativa? Explicar con ejemplos y pruebas. ¿Cómo uso este concepto en la programación competitiva?

¿Cuál es el algoritmo más rápido para encontrar el número más grande en una matriz sin clasificar?

¿Qué libros de algoritmos y estructuras de datos tratan bien la recursividad?

Cómo trabajar en unidades donde c = 1

¿Cuáles son algunas aplicaciones del mundo real de punteros en la programación con ejemplos?

¿Alguien puede escribir una función Javascript que haga esto: add (1) (2) (8) debería devolver 11, es decir, la suma de los argumentos dados (el número de argumentos puede ser cualquier número natural)?

¿Cómo podemos entender profundamente la criptografía de curva elíptica y su implementación en cualquier lenguaje de programación?