¿Por qué todos los tutoriales de programación funcional son tan complicados?

20

He estado tratando de aprender programación funcional y la mayoría de los tutoriales que he encontrado usan las matemáticas como ejemplos para las construcciones más complicadas (incluso las simples en algunos casos). ¿Por qué es esto? Me imagino que se podría usar algo más fácil. Hace que sea difícil de aprender.

Información de antecedentes: He estado escribiendo software durante 12 años. Entiendo algunos de los conceptos como cierres, funciones como ciudadanos de primera clase y genéricos. Puede que tenga problemas con las funciones de orden superior en algún nivel avanzado, pero me gustaría creer que tengo una comprensión básica. Las mónadas me están mordiendo en el trasero, y en este punto no he superado eso (estoy seguro de que eventualmente lo haré, porque soy persistente).

Charles Lambert
fuente
solo un poco, no he probado los otros 3 idiomas que sugirió
Charles Lambert
F # es lo más fácil de comenzar si conoce C #. No solicita grandes conocimientos matemáticos.
cnd
66
Pruebe SICP: no va mucho más allá de las matemáticas de la escuela secundaria.
SK-logic
@Charles Lambert - Ve a ver OfficeSpace y obtendrás la segunda parte del comentario de Job.
Jetti
@Charles Lambert: Learn You a Haskell for Great Good no es demasiado complicado: D
Matthieu M.

Respuestas:

21

Utilizan las matemáticas porque la programación funcional es muy buena para modelar construcciones matemáticas y está muy ligada a los conceptos matemáticos, particularmente el cálculo de Lambda. Además, dado que la E / S suele ser una asignatura bastante espinosa y avanzada en muchos idiomas del paradigma funcional, las matemáticas a través de las REPL de los distintos idiomas se convierten en una buena forma de enseñar el idioma al principio.

Debido a que la programación funcional trata las funciones como construcciones de primera clase dentro del lenguaje de programación, la generación de funciones se vuelve muy importante. Por lo tanto, las matemáticas más altas se vuelven bastante importantes, particularmente la teoría de grafos.

Los lenguajes imperativos son igual de matemáticos, pero todo es aritmético en la base, ya que están más cerca de la máquina que solo pueden agregar de todos modos. Los lenguajes funcionales con su mayor abstracción tienden más a las matemáticas. El uso general en la academia tampoco ayuda a medida que se acostumbran y, por lo tanto, son enseñados por personas que saben muchas matemáticas y están enseñando a personas que esperan aprender muchas matemáticas. Por lo tanto, es posible "simplificarlo", por así decirlo, pero es poco probable dados estos factores.

http://learnyouahaskell.com/ - Es probablemente una de las introducciones más suaves a la Programación Funcional, lo verifiqué dos veces y no hay nada más allá de la teoría básica de álgebra y grafos.

Ingeniero mundial
fuente
learnyousomeerlang.com también es una opción si quieres algo más además de Haskell.
Travis
11

Existen numerosas razones, y todas están relacionadas:

  • La mayoría de los lenguajes de programación funcionales se desarrollaron en un contexto académico, donde CS está estrechamente relacionado con las matemáticas, por lo que las personas que los diseñaron tienen una sólida formación en matemáticas (y tienden a asumir lo mismo sobre su audiencia)
  • La programación funcional es un paradigma especialmente adecuado para resolver problemas matemáticos pesados
  • La teoría detrás de FP, cálculo lambda (básicamente, una teoría abstracta de funciones), es una rama de las Matemáticas, y los lenguajes FP tienden a usar los conceptos y la terminología del cálculo lambda

Además, FP no es más math realmente que otros paradigmas, pero los conceptos clave (funciones como ciudadanos reales de primera clase, funciones de orden superior, cierres y pureza) requieren una cierta mentalidad. En algún momento, tu mente debería hacer "clic"; Si comprende estas 4 ideas centrales, es probable que el resto sea tan fácil como cualquier otro paradigma.

tdammers
fuente
3
+1 para desarrollado en la academia: las personas que crean lenguajes funcionales lo basan en propiedades matemáticas, por lo que se filtra ...
Matthieu M.
@Matthieu M: Basar un lenguaje de programación en propiedades matemáticas ayuda a escribir el software correcto y reducir el tiempo de desarrollo. Por ejemplo, definitivamente paso menos tiempo depurando mi código Haskell que mi código C ++. Reducir el tiempo de desarrollo (y los costos) es una gran ventaja práctica que puede justificar el esfuerzo de aprender algunas matemáticas. Como señaló Tdammers, hay algunos conceptos adicionales que deben aprenderse, pero después de haber entendido algunas ideas centrales, FP es tan intuitivo como la programación imperativa.
Giorgio
También estoy de acuerdo con tdammers en que también se pueden describir lenguajes imperativos utilizando conceptos matemáticos. De hecho, una descripción matemática de un programa imperativo es normalmente mucho más compleja que una descripción matemática de un programa funcional. En mi opinión, esto explica por qué los lenguajes imperativos tienen más probabilidades de contener errores: es más difícil comprender completamente el código imperativo. Al menos, esta es mi experiencia personal con unos pocos años de programación funcional y muchos años más de programación imperativa.
Giorgio
@Giorgio: hay una diferencia entre "filtrarse al idioma" (de alguna manera) y "filtrarse al tutorial". Estoy bastante seguro de que podrías escribir un tutorial de programación funcional sin tantas matemáticas. Por supuesto, si serían mejores o no depende del debate y probablemente sea subjetivo.
Matthieu M.
@MatthieuM .: Muchas gracias por aclarar lo que querías decir con filtraciones (filtrando en el tutorial): tu comentario tiene mucho más sentido para mí ahora. Estoy de acuerdo con usted en que un tutorial sobre FP debería contener la menor cantidad de matemática posible. De alguna manera había malinterpretado su comentario: después de haber trabajado tanto en la industria como en la academia, soy un poco sensible a "en la academia hacen muchas matemáticas que son inútiles en el mundo real". +1 tanto por tu comentario como por la respuesta de tdammer.
Giorgio
5

Es porque fundamentalmente, la programación de computadoras es matemática. Los lenguajes funcionales se diseñaron teniendo esto en cuenta y es por eso que gran parte de los tutoriales se centran en las matemáticas.

Solo es difícil de aprender si no estás acostumbrado a pensar que la programación de computadoras tiene una base matemática.

Rudolf Olah
fuente
44
Fundamentalmente, la computación es una combinación de lógica y aritmética. Esto no es matemática. No puede expresar una instrucción de bifurcación en una fórmula matemática, por lo que no puede basarse en matemáticas. La multitud de programación funcional desearía que se basara en matemáticas para que desarrollen lenguajes de programa que se comporten como si no existieran instrucciones de ramificación.
James Anderson
99
@ James Anderson, ¿estás diciendo que la lógica y la aritmética no son matemáticas? Y he visto toneladas de fórmulas matemáticas que contienen instrucciones de ramificación (generalmente expresadas en un formalismo similar a un interruptor).
Peter Taylor
44
Aritmética un subconjunto de matemáticas que trata con cálculos simples. La lógica es un superconjunto de matemáticas que es la base de todo pensamiento racional. Por cierto, la programación funcional es una muy buena idea para resolver problemas que pueden expresarse matemáticamente; no es tan caliente cuando usted está tratando de seguir un desastre ilógica de reglas arbitrarias como GAP (por lo general las prácticas aceptadas de contabilidad)
James Anderson
66
@ ian31, ¿cómo definirías la palabra " fundamentalmente "? Ya sabes, la ingeniería civil también se basa en la física y las matemáticas, mientras que prácticamente se trata de construir cosas para que las personas las usen y disfruten. Y, de cualquier manera, incluso antes de comenzar a pensar en programar una solución a algún problema del mundo real, debe traducir ese problema en algún formalismo matemático. Simplemente no funcionará de otra manera. La programación tiene que ver con formalismos.
SK-logic
66
@ ian31, los lenguajes de programación son formalismos. Su comportamiento está estrictamente definido y predecible. Por lo tanto, codificar cualquier modelo en particular (incluso si es vago) lo está convirtiendo en una especie de formalismo. Las matemáticas se adaptan bien a esta vaga área, a pesar de la percepción general de que se limita al brillante mundo cristalino de modelos estrictos bien definidos.
SK-logic
1

Creo que "The Little Schemer" es una excelente introducción a la programación funcional y no es nada math. No entra en las mónadas, por lo que puede ser demasiado básico para sus gustos, pero hace una derivación del combinador en Y hacia el final.

Recientemente lo revisé después de no hacer ninguna programación funcional desde la universidad hace 12 años, y fue una gran actualización, definitivamente me siento listo para abordar cosas más avanzadas después de resolver la mayoría de los problemas en el libro usando Racket.

Paul Sanwald
fuente