Como resultado de la discusión de comentarios aquí , me pregunto si puede aprender la programación funcional en C?
9
Como resultado de la discusión de comentarios aquí , me pregunto si puede aprender la programación funcional en C?
Respuestas:
Obviamente, puedes hacer programación funcional en C. En teoría, también puedes aprender principios de programación funcional en C, pero el lenguaje no lo hace fácil.
Supongo que tiene al menos un poco de experiencia en OOP; si lo hace, debe tener en cuenta que la POO se puede hacer en C, incluido el polimorfismo, captadores / establecedores, reglas de visibilidad, etc., etc., pero es bastante doloroso hacerlo, y necesita saber tanto POO como C en el interior fuera para lograrlo. Es lo mismo con FP.
Lo que debería hacer es aprender primero un lenguaje de programación funcional (la mayoría de ellos tienen reglas de sintaxis sorprendentemente simples; no es la sintaxis lo que los hace difíciles de aprender), y luego dejar que su sabiduría recién adquirida influya en la forma en que escribe C.
Según la solicitud, algunas cosas que puede aprender de FP y luego aplicar en, por ejemplo, C, C ++ o Java:
fuente
C puede ser pirateado para ofrecer algunos conceptos funcionales:
Esta pregunta de StackOverflow le dará más información. Pero aunque parece posible hacer una programación funcional (o un gran subconjunto de) en C, los hacks y las extensiones del compilador y lo que sea no son la mejor manera de aprender un concepto.
Para aprender realmente la programación funcional, su mejor opción es uno de los lenguajes de programación funcional prominentes como Lisp y sus dialectos ( Clojure , Scheme ), Erlang y Haskell . Cualquiera de esas son herramientas perfectas que funcionan dentro de la mentalidad de programación funcional. F # también es un buen candidato si tiene experiencia en .Net, pero es un lenguaje de paradigmas múltiples, no estrictamente un lenguaje de programación funcional.
Como señala Tdammers en los comentarios:
Que yo sepa, Lisp y sus dialectos y Erlang son mejores candidatos que F # porque fomentan la programación funcional sobre otros paradigmas, lo que Tdammers afirma maravillosamente como punto de partida de un lenguaje . F # abarca la programación funcional pero no la alienta sobre sus otros paradigmas compatibles, programación imperativa y oo.
fuente
No puede aprender todos los aspectos de la programación funcional en C. Pero seguramente puede comenzar la programación de estilo funcional con cualquier lenguaje imperativo. Estos bits iniciales son: "Cómo mantener las cosas puras mientras se programa". Y se puede hacer C también. Consulte esta publicación de blog para obtener más detalles.
http://www.johndcook.com/blog/2011/07/24/get-started-functional-programming/
fuente
TL; DR
La programación funcional se trata de cierres y sus aplicaciones. A menos que alguien pueda mostrarle una biblioteca de cierre de descenso para C, olvídese de usar C para aprender programación funcional.
¿Qué es la programación funcional?
El concepto fundamental de la programación funcional es la noción de cierres que, en términos generales, captura una función junto con enlaces de variables. Además del uso generalizado de los cierres, existen algunos otros rasgos distintivos en la programación funcional, como el uso de funciones recursivas y valores inmutables (ambos juegan bien juntos). Estos rasgos son más un problema cultural que cualquier otra cosa, y no hay ninguna obstrucción técnica para usarlos en prácticamente cualquier idioma, es por eso que me concentro en los cierres en mi respuesta: no todos los idiomas permiten crear cierres fácilmente.
Tres ilustraciones de la utilidad de los cierres.
Un uso típico de los cierres es la implementación de mecanismos de privacidad. Por ejemplo, el código Javascript: en los ejemplos elegí Javascript porque es un lenguaje funcional con una llamada "sintaxis tipo C" y su pregunta sugiere que está familiarizado con C:
Luego con
Tenemos dos funciones
a
yb
contando colecciones disjuntas. El punto del ejemplo es que las variablesx
son capturadas por el cierre que define elcounter
cierre y cada vez que hay un nuevocounter
cierreis instantiated by the function, it gets its fresh own idea of what
x`.Otro uso típico de los cierres es la definición de aplicaciones parciales de funciones. Suponga que tenemos un servicio de informes similar a la
syslog
implementación de una funcióndonde los argumentos
priority
ymessage
se espera que sean cadenas, siendo el primero uno de"debug"
,"info"
y así sucesivamente. Podemos definir una fábrica de registros como esta:y úselo para definir versiones especializadas de nuestra instalación de registro:
Esto es muy útil, porque en lugar de escribir
for
bucles propensos a errores como estepodemos escribir el más limpio, más corto y mucho más simple (no hay
i
, eso es mucho mejor):Un tercer campo de aplicación importante de los cierres es la implementación de la evaluación diferida: tenga en cuenta que el soporte de lenguaje especial puede proporcionar una mejor implementación.
Una función perezosa, en lugar de realizar un cálculo directo, devuelve un cierre que se puede llamar (o "forzar" en la jerga de la pereza) para realizar la pregunta. La motivación para hacer esto es que separa la preparación de un cálculo y la realización de un cálculo. Un ejemplo práctico de esto es la compilación de expresiones regulares: si un programa compila muchas expresiones regulares en el momento del inicio, necesitará mucho tiempo para comenzar. Si en cambio compilamos perezosamente las expresiones regulares y las forzamos a medida que las necesitamos, entonces nuestro programa puede comenzar rápidamente. Por supuesto, las expresiones regulares pueden sustituirse aquí con cualquier estructura que requiera un tiempo de inicialización considerable.
Aquí se explica cómo implementar una evaluación diferida con cierres. Considere la implementación clásica de la función arrayMax que devuelve el máximo en una matriz:
La variante perezosa sería:
El valor devuelto es un cierre que se puede usar para calcular el valor o recuperarlo en otro momento si ya se ha calculado.
Con estos tres ejemplos, debemos estar seguros de que los cierres y sus aplicaciones son el núcleo de la programación funcional.
Conclusión
Aprender programación funcional significa aprender a programar con cierres. Como consecuencia, los lenguajes que permiten la fácil manipulación de los cierres, y especialmente la aplicación parcial de funciones, deben considerarse al buscar un lenguaje para estudiar la programación funcional. Por el contrario, los idiomas donde los cierres no pueden ser fácilmente manipulados serían malas elecciones.
fuente
Creo que las herramientas que utilizas influyen mucho en tu aprendizaje. Es casi imposible aprender conceptos de programación para los cuales el lenguaje de programación que utiliza no proporciona los medios para utilizarlo. Claro, siempre puedes aprender algunas cosas, pero no puedes aprenderlas correctamente.
Pero eso es académico de todos modos, porque, como Martinho dice en su comentario , incluso si pudieras aprender programación funcional, no deberías intentar hacerlo, porque hay lenguajes donde esto es mucho más fácil.
fuente
No debe aprender programación funcional en C, sino en un lenguaje funcional estricto (Haskell, Caml, Erlang, etc.).
Si eres nuevo en funcional, nunca lo conseguirás realmente con un lenguaje no funcional. Lo más probable es que te entrenes para hacer lo que crees que es programación funcional y aprender las cosas de manera incorrecta. Y siempre es más difícil "volver a aprender" las cosas de la manera correcta que aprenderlas de la manera correcta al principio.
De todos modos, creo que hacer funcional en C es un buen ejercicio para alguien que ya sabe funcional. Porque esa persona aprenderá lo que sucede detrás del capó, lo que realmente está haciendo la computadora.
fuente