2012-07-13 15 views
6

Me gustaría aprender un lenguaje funcional para ampliar mi horizonte. Tengo conocimiento de Python y C/C++ y deseo que un idioma sea fácil de aprender de alguien que proviene del dominio imperativo de los idiomas. No me importa si el lenguaje es lo suficientemente poderoso. Solo quiero un lenguaje para aprender lo básico de la programación funcional y luego intentaré un lenguaje más difícil (y poderoso).¿Cuál es el lenguaje de programación funcional más fácil para alguien que tiene experiencia en lenguajes imperativos?

Gracias

+3

Haskell a menudo se recomienda aprender el paradigma funcional, ya que es puro. No es fácil, pero quizás te confundas al mezclar el paradigma funcional y de procedimiento en otros idiomas (Scala y otros). – MatijaSh

Respuesta

8

recomiendo pure-lang para estos fines pedagógicos. También es bastante poderoso. Si quiere algo más popular/con más apoyo de la comunidad, entonces le recomendaría Scheme u OCaml, dependiendo de si prefiere tratar con sintaxis desconocida (vaya con Scheme) o trate primero con mecanografía desconocida (vaya con OCaml). SML y F # son solo ligeramente diferentes de OCaml. Otros han mencionado o mencionarán a Clojure, Scala y Haskell.

Clojure es una variante de Scheme, con sus propias idiosincrasias (por ejemplo, sin optimización de la cola de llamada), por lo que su uso sería una forma de comenzar con Scheme. Sin embargo, esperaría que le resultara más fácil con una implementación del Esquema menos idiosincrásica. Racket es lo que se usa a menudo para enseñar. Scala parece ser fundamentalmente similar a OCaml, pero esto se basa solo en la familiaridad informal.

A diferencia de Haskell, los otros idiomas mencionados tienen dos ventajas: (1) el orden de evaluación está ansioso por defecto, aunque puede obtener una evaluación diferida solicitándolo específicamente. En Haskell está al revés. (2) La mutación está disponible, aunque la mayoría de las bibliotecas y el código que verá no la usarán. De hecho, creo que es pedagógicamente mejor aprender programación funcional y, al mismo tiempo, observar cómo interactúa con los efectos colaterales, y trabajar en la composición de estilo monádico un poco más adelante. Entonces creo que esto es una ventaja. Sin embargo, algunos te dirán que, sin embargo, es mejor tirarse al manejo más en cuarentena de Haskell de mutaton.

Robert Harper en CMU has some nice blog posts on teaching functional programming. Según entiendo, también prefiere idiomas como OCaml para la enseñanza.

Entre las tres clases de idiomas que recomendé (Pure, Scheme y amigos, OCaml y amigos), las dos primeras tienen tipado dinámico. El primero y el tercero tienen celdas de referencia explícitas (como si en Python, se restringiera a nunca reasignar una variable pero aún podría cambiar lo que está almacenado en un índice de lista). El esquema tiene celdas de referencia implícitas: las variables mismas parecen mutables, como en C y Python, y el manejo de la celda de referencia se realiza bajo las cubiertas. En idiomas como ese, a menudo también tiene disponible algún tipo de celda de referencia explícita (como en el ejemplo que acabo de dar en Python, o usando pares/listas mutables en Racket ... en otros esquemas, incluido el estándar Scheme, esos son los pares/listas predeterminadas).

Una virtud que tiene Haskell es que algunos libros de texto están apareciendo para ella. (Me refiero a esto sinceramente, no irritablemente.) Qué libros/recursos usar es otro tema controvertido con muchas guerras/preguntas cerradas. SICP como otros han recomendado tiene muchos fans y también algunos críticos. Me parece que hay muchas buenas opciones. No me aventuraré más en esos debates.

1

Esta pregunta es, probablemente, fuera de lugar, ya que va a dar lugar a guerras idioma sin fin, pero aquí es un poco general del consejo:

Hay una clase de lenguajes de programación funcionales, que a veces se llaman "sobre todo funcional" , ya que permiten algunas características imperativas donde los quiere. Los ejemplos incluyen ML estándar, OCaml, F # y Scala. Puede considerar uno de estos si desea poder controlar el estilo idiomático funcional sin dejar de ser capaz de lograr cosas de una forma razonablemente familiar.

He usado el estándar ML extensivamente en el pasado, pero si buscas algo que tenga una curva de aprendizaje un poco menor, yo personalmente recomendaría Scala, que es mi segundo lenguaje de programación favorito. Las razones para esto incluyen la prevalencia de bibliotecas, una comunidad de tamaño saludable y la disponibilidad de buenos libros y tutoriales para ayudarlo a comenzar (especialmente si alguna vez ha tenido alguna relación con Java).

+1

Me pregunto si la capacidad de recurrir al estilo imperativo cuando lo desee puede convertirse en un impedimento para aprender el estilo funcional. – Thilo

+0

La pregunta pedía específicamente "lo más fácil de aprender", así que aunque estoy de acuerdo en que tener un repliegue imperativo puede no ser la mejor estrategia a largo plazo, reduce la curva de aprendizaje de modo que no tiene que aprender cómo funciona IO en un entorno puro al mismo tiempo que todo lo demás :) – Gian

+0

Sí, espero que esta pregunta se cierre pronto. – dubiousjim

4

Al principio, lea Estructura e implementación de programas de computadora. Recomiendo Lisp (por ejemplo, es dialecto Scheme) como primer lenguaje de programación funcional.

+0

Estoy de acuerdo con su sugerencia. Me he beneficiado mucho del SICP y de los ejercicios.También recomendaré encarecidamente estudiar el SICP. – weima

+0

Posiblemente el nombre del libro sea _Estructura e interpretación de programas de computadora_ – ibubi

2

Otra opción es Clojure, que según tengo entendido es más "puramente" funcional que Scheme/Racket (no me preguntes acerca de los detalles aquí) y posiblemente lo suficientemente similar como para permitirte usarlo junto con SICP (Estructura e interpretación de programas de computadora, un libro altamente recomendado también sugerido por otra respuesta).

1

Un elemento que no se discutió es la disponibilidad de una sintaxis de coincidencia de patrones especial para tipos de datos algebraicos, como en Haskell, todos los sabores de ML, y probablemente varios de los otros idiomas mencionados. La sintaxis de coincidencia de patrones tiende a ayudar al programador a ver sus funciones como funciones matemáticas. La sintaxis de Haskell es suficientemente compleja, y sus implementaciones tienen mensajes de error de análisis lo suficientemente pobres, que la sintaxis es una razón de peso para no elegir Haskell. Es probable que Scheme sea más fácil de aprender que la mayoría de las otras opciones (y Scheme probablemente tenga el rey de todos los macro sistemas), pero la falta de sintaxis de coincidencia de patrones me alejaría de ello para una introducción a la programación funcional.

+1

Estoy completamente de acuerdo sobre la importancia de la coincidencia de patrones en el aprendizaje de la programación funcional. Sin embargo, creo que estará disponible con más o menos trabajo en la mayoría o en todas las opciones. Muchas implementaciones de Scheme tienen coincidencia de patrones al menos como una extensión; La raqueta lo tiene de forma nativa. Se distribuye una versión independiente de la implementación con el libro de texto Essentials of Programming Languages. Por supuesto, alguien que aprenda FP con Scheme debería asegurarse de explotar estas instalaciones. – dubiousjim

+1

Mi recuerdo es que la sintaxis para la coincidencia de patrones en Racket es mucho menos legible y escribible que la sintaxis para hacerlo en ML. ¿Estoy confundido? El hecho de que Racket no tenga tipos de datos algebraicos (aunque el sub-lenguaje PLAI hace un muy buen trabajo al fingirlos) empeora las cosas. – dfeuer

+0

@dfeuer Lo discutí largamente con la comunidad Lisp cuando elegí entre Lisp y OCaml. Los Lispers responderían que Lisps podría no tener tipos de datos algebraicos, pero tienen macros que te permiten escribir tu propia biblioteca de patrones de coincidencia que es aún más poderosa porque puedes hacer la unificación completa. Sin embargo, la coincidencia de patrones es omnipresente en OCaml, F #, Haskell y Scala, mientras que la unificación es casi desconocida en Lisp, Scheme, Racket y Clojure. Entonces creo que es justo decir que los Lispers perdieron ese. La coincidencia de patrones es muy valiosa, lo que hace que los ML sean mucho mejores que los Lisp. –

2

Me gustaría aprender un lenguaje funcional para ampliar mi horizonte. Tengo conocimiento de Python y C/C++ y deseo que un idioma sea fácil de aprender de alguien que proviene del dominio imperativo de los idiomas. No me importa si el lenguaje es lo suficientemente poderoso. Solo quiero un lenguaje para aprender lo básico de la programación funcional y luego intentaré un lenguaje más difícil (y poderoso).

¡Gran pregunta!

Había hecho BASIC, Pascal, ensamblador, C y C++ antes de comenzar a hacer programación funcional a fines de la década de 1990. Luego comencé a usar dos idiomas funcionales al mismo tiempo, Mathematica y OCaml, y los estaba usando exclusivamente en unos pocos años. En particular, OCaml me permitió escribir un código imperativo que se parecía al código que había estado escribiendo antes. Me pareció valioso como aprendiz porque me permitió comparar los diferentes enfoques que hacían obvias las ventajas de ML.

Sin embargo, como han mencionado otros, el beneficio principal de Mathematica y OCaml es la coincidencia de patrones y que no está técnicamente relacionado con la programación funcional. Posteriormente, he analizado muchos otros lenguajes funcionales, pero no deseo volver a un idioma que no tenga coincidencia de patrones.

Cuestiones relacionadas