Funcional como primer idioma

Respuestas:

16

Un problema importante es que si comienzas con un lenguaje como Haskell, todo lo demás parecerá deficiente.

Honestamente, creo que comenzar con un lenguaje como Haskell o esquema sería una gran idea.

(Admito que soy adicto al lenguaje funcional) EDITAR:

OK lo que me gusta de ambos idiomas:

Scheme toma un lenguaje muy simple y construye un lenguaje maravillosamente robusto para el desarrollo. También SICP está escrito sobre un esquema que hace que valga la pena aprender allí mismo. Scheme trata sobre la cosa más simple que puedas imaginar que podría ser un lenguaje completo.

Haskell Lo que realmente está creciendo en mí es el sistema de tipos. Muchos de los errores que veo en otros idiomas se deben al tipo incorrecto que aparece en alguna parte. En Haskell eso es casi imposible. Además, la idea de un lenguaje vago solo tiene algunas cosas geniales que se le caen. Por ejemplo, puede crear estructuras de datos infinitas en Haskell y luego solo crear la parte que necesita.

Zachary K
fuente
Para ser justos, muchos idiomas están incorporando más y más aspectos funcionales, por lo que la vida no es tan mala como solía ser.
Tikhon Jelvis
Es cierto, y para alguien que ama la PF, esto no es más que algo bueno
Zachary K
3
Lo sé, estoy sugiriendo esto como una buena razón para aprender FP primero. Es una tendencia que me ha estado haciendo muy feliz por un tiempo.
Tikhon Jelvis
Sin embargo, realmente no dice mucho para responder a la pregunta: ¿por qué te gusta Haskell (o Scheme)? ¿Serían buenos como primeros idiomas para aprender? ¿Por qué?
jimwise
Añadido algunos comentarios sobre los dos idiomas
Zachary K
6

La mayor ventaja de aprender un lenguaje funcional antes de aprender un lenguaje OOP es que tus habilidades de programación se desarrollan primero y luego puedes comprender fácilmente los conceptos de OOP. Si comienzas directamente con un lenguaje OOP, tendrás que aprender dos cosas simultáneamente: "pensar en el código" y "pensar en el OOD". Se puede distraer. Primero practique con un lenguaje funcional y desarrolle sus habilidades de programación. Luego aprende OOP y otros paradigmas. Dado que OOP fue diseñado para compensar las deficiencias en la programación estructural, será más fácil entender por qué. Esa es la razón por la cual los cursos de CS comienzan con C y luego continúan con C ++.

DPD
fuente
1
En mi universidad, comenzamos con un lenguaje funcional, ML estándar y aprendimos qué son los efectos secundarios. Después de eso aprendimos C pero nunca aprendimos C ++.
Jonas
@Jonas. Supongo que diferentes países / universidades tienen estructuras de curso muy diferentes. En mi universidad, C seguido de C ++ es un estándar para los cursos de Ing. De Ciencia Comuter pero para otras corrientes de ingeniería, solo se enseña C.
DPD
En mi universidad comenzamos con Java, y luego usamos el lenguaje apropiado para los cursos después de eso. Por ejemplo, C / C ++ se usa para la programación de sistemas, C # para la interfaz de usuario, varios lenguajes de ensamblaje para la organización de computadoras y creo que lo que quieras para la programación de juegos
Carson Myers
En mi universidad, comenzamos aprendiendo Scheme (con SICP). Las primeras semanas fueron completamente funcionales; OOP se introdujo bien en el curso. Pensé que todo estaba muy bien y me gustó mucho el curso.
Tikhon Jelvis
6

Sobre la cuestión de cómo aprender programación comenzando con la programación funcional, dos recomendaciones clásicas:

  • El primero, y obvio, es la clásica Estructura e Interpretación de los Programas de Computadora , de Abelson y Sussman, que sigue siendo una de las mejores introducciones a CS, y se enseña desde una perspectiva funcional, utilizando Scheme. Está disponible en línea completa . Si no comienzas aquí, deberías llegar aquí como un punto.

  • Un texto más reciente que cubre la mayor parte del mismo terreno a un ritmo más suave y con un enfoque más fuerte en la ingeniería de software es Cómo diseñar programas , por Matthew Felleisen y un grupo de otros del equipo Racket / PLT, que utiliza el dialecto Racket de Esquema. También está disponible en línea , al igual que la segunda edición en progreso . Este libro tiene la ventaja de que está diseñado para usarse con el entorno de programación DrRacket, que proporciona una interfaz muy amigable para principiantes y expertos por igual para experimentar con el código.

Sobre la pregunta de por qué comenzar con la programación funcional, me gustaría señalar el blog de Bob Harper . Carnegie Mellon recientemente reorganizó su plan de estudios de CS para enseñar primero la programación funcional, y Harper ha estado cubriendo su progreso paso a paso en su blog. Como uno de los hombres detrás de la definición de ML estándar, es obvio que él está a favor de este movimiento, y argumenta las razones para ello.

Finalmente, advertiría en contra de aprender Haskell primero, aunque otros pueden estar en desacuerdo. Si bien el enfoque puro de Haskell para la PF ciertamente generará buenos hábitos, el enfoque del lenguaje en la computación perezosa no es necesariamente una buena combinación para el principiante; Una de las primeras y más importantes cosas que deberá aprender a hacer como programador es razonar sobre exactamente lo que está haciendo su programa mirando la fuente y sobre el costo relativo de los diferentes enfoques para el mismo problema. Según mi experiencia, la pereza de Haskell hace que ambas actividades sean un desafío incluso para programadores experimentados, aunque Your Mileage May Vary.

jimwise
fuente
5

La principal ventaja (o no desventaja) de comenzar con FP es que la mayoría de los conceptos también pueden aplicarse a la programación imperativa. Realm of Racket utiliza analogías de videojuegos para enseñar conceptos funcionales e imperativos, y los estudiantes dedicados se quedan no solo con un juego funcional (npi), sino con una sólida comprensión de condicionales, recursividad, bucles, ADT y diseño impulsado por eventos. Estos conceptos son prácticamente ubicuos en la programación moderna y se usan constantemente.

Sin embargo, aún más importante es aprender a codificar abstracciones , algo en lo que FP sobresale, con el uso de funciones de orden superior y tipos de datos. Cómo diseñar programas tiene un enfoque único para esto mediante la enseñanza a través de la inducción. Por ejemplo, los estudiantes aprenden cómo foldfunciona al mirar el código para tomar tanto la suma como el producto de una lista, encontrar lo que tienen en común y derivar la implementación ellos mismos.

El equivalente OOP de lo anterior probablemente implicaría uno o más de los siguientes: interfaces, clases abstractas, genéricos, functores o (si lo está haciendo mal) singletons. Si bien estos son patrones de diseño perfectamente aceptables en Java, en mi humilde opinión, no pertenecen a un plan de estudios introductorio y solo sirven para ofuscar los principios subyacentes. Incluso como alguien que se introdujo en los lenguajes FP "tarde", puedo decir que navegar por el mar en constante cambio de OOP se ha hecho mucho más fácil al tener un ancla funcional fuerte.

error
fuente
Casi lo olvido: si usted quiere comprar Reino de la raqueta, probar este cupón: RACKETEERS. No estoy seguro de cuándo caduca, lo siento.
error
+1 por mencionar funciones de orden superior: estaba listo para publicar mi propia respuesta sobre ellas. La mitad de mis compañeros de trabajo luchan con el concepto, y el resto que los consigue no piensa en ellos cuando sería la solución más simple.
Izkata
1
No había oído hablar de Realm of Racket, pero por el título inmediatamente supe de qué se trataba, porque el título es una referencia a su hermano mayor, Land of Lisp.
Magus
4

La programación funcional hace las cosas mucho más fáciles. En los lenguajes OOP, debe lidiar con la administración del estado en varios subprocesos sin arruinar ese estado. En los lenguajes funcionales, cuando la mayoría del trabajo que se realiza se realiza mediante funciones puras, no tiene que preocuparse por ello.

En términos de velocidad / rendimiento, no soy un verdadero jinete de rendimiento, pero ser funcional no significa ser lento, y la estructura de los lenguajes funcionales tiene poco que ver con su velocidad. La sintaxis de los lenguajes funcionales varía mucho, como las diferencias entre Clojure y Haskell. Clojure es muy rápido como está, y puede alcanzar (y a veces exceder) las velocidades de Java con la optimización posterior.

Entonces todo depende de lo que estés buscando

MattyD
fuente
2

Creo que la disponibilidad de material de aprendizaje, algunos buenos ejemplos de código y mentores son muy importantes al aprender lenguajes de programación. Dependiendo de su situación, es posible que tenga un mentor que pueda enseñarle, etc., pero creo que los recursos funcionales de lenguaje son muy pocos en comparación con los idiomas principales. Significa que progresará más lentamente en comparación con el aprendizaje de idiomas convencionales. Pero si no tiene prisa, entonces esto no es un problema.

Endy Tjahjono
fuente
1
Creo que tus suposiciones están equivocadas. No son tutoriales buenos, libros, papeles, etc sobre la materia funcional. Además, hay muchos documentos que tratan temas especiales como el sistema de tipos, la implementación, las máquinas virtuales, el cálculo lambda, etc.
Ingo
1

Quizás la razón más importante para considerar el aprendizaje de lenguajes de programación funcional es la comprensión de los tipos de datos algebraicos. El mapeo mental ayudará a modelar las relaciones de clase OO e incluso el diseño de bases de datos.

El enfoque en los sistemas multinúcleo / multiprocesador enfatiza el uso de algoritmos paralelos que se pueden expresar de manera más clara y concisa en FP. La rama lambda de idiomas probablemente verá un fuerte aumento en el uso en las próximas una o dos décadas.

Pero también hay algunas trampas comunes. Creer que FP es más simple es un gran error, ya que calcular la complejidad del espacio y el tiempo, así como entregar pruebas de detención, puede ser mucho más desafiante en el cálculo lambda, especialmente en idiomas que admiten una evaluación diferida.

¡Entonces, aprende ambos! O tal vez mejor: primero aprende un idioma que abarque ambos, como Scala. Si no le molestan las camisetas con corbata y un ligero acento holandés, tal vez encuentre útiles las conferencias de FP del Dr. Erik Meijer , que están en MSDN.

Dibbeke
fuente