¿Esquema vs Haskell para una introducción a la programación funcional?


36

Me siento cómodo con la programación en C y C #, y exploraré C ++ en el futuro. Puede que me interese explorar la programación funcional como un paradigma de programación diferente. Estoy haciendo esto por diversión, mi trabajo no involucra programación de computadora, y estoy algo inspirado por el uso de programación funcional, enseñada bastante temprano, en cursos de informática en la universidad. El cálculo de Lambda ciertamente está más allá de mis habilidades matemáticas, pero creo que puedo manejar la programación funcional.

¿Cuál de Haskell o Scheme serviría como una buena introducción a la programación funcional? Utilizo emacs como mi editor de texto y me gustaría poder configurarlo más fácilmente en el futuro, lo que implicaría aprender Emacs Lisp. Sin embargo, entiendo que Emacs Lisp es bastante diferente de Scheme y también es más procesal que funcional.

Probablemente estaría usando el libro "The Little Schemer", que ya he comprado, si sigo Scheme (me parece un poco extraño por mi limitado hojearlo). O usaría el "Aprende un Haskell por un gran bien" si persigo a Haskell. También vería los videos de Introducción a Haskell del Dr. Erik Meijer en el Canal 9.

Cualquier sugerencia, comentario o aportación apreciada.

Gracias.

PS BTW También tengo acceso a F # ya que tengo Visual Studio 2010 que utilizo para el desarrollo de C #, pero no creo que ese sea mi criterio principal para seleccionar un idioma.


3
No lo olvidesReal World Haskell
alternativa el

15
Comentario secundario menor: el cálculo lambda es un sistema extraordinariamente simple; Lo bueno de esto no es que sea complejo, sino todo lo contrario; que puedes expresar todo lo que quieras en un sistema tan simple. Comience con un lenguaje de programación; ahora descarta TODO excepto las referencias de variables, definiciones de funciones y llamadas a funciones. Voila! Cálculo lambda.


99
Puedo enseñarte cálculo lambda en cinco minutos. Ahora, comprender las consecuencias de lo que acaba de aprender lleva toda una vida. :)

55
¡Elegí Haskell sobre Scheme principalmente porque no tiene tantos paréntesis malditos!
Joey Adams

Respuestas:


27

Yo recomendaría OCaml.

En mi punto de vista personal, la base principal de las programaciones funcionales modernas son las funciones de orden superior, un sistema de tipo estático y los tipos de datos algebraicos y la coincidencia de patrones.

Entre un Scheme, un ML y un Haskell, elegiría el ML porque creo que es el más relevante para esta definición. Scheme no tiene tipeo estático (existe Typed Racket, pero no es para los principiantes del esquema), y Haskell tiene muchas otras cosas (mónadas, evaluación perezosa ...) que, si bien son interesantes, pueden desviar la atención de la base importante .

SML y OCaml son igualmente interesantes; Estoy más acostumbrado a OCaml, y tiene un sentimiento más "práctico" que es agradable (pero si realmente quieres "práctico" a riesgo de perder tu alma, también puedes elegir F #).

Scheme y Haskell también son idiomas muy interesantes. El énfasis del esquema en las macros es interesante, pero no está directamente relacionado con la programación funcional (es otra de las cosas en el mundo que definitivamente debería probar, así como la programación lógica, los lenguajes basados ​​en la pila y la E orientada a la capacidad).

Haskell es definitivamente un gran lenguaje y, creo, un punto obligatorio para los aspirantes a gurús de la programación funcional. Pero como los idiomas principales de OCaml y Haskell son muy similares (excepto por la evaluación perezosa que distrae al principiante), es fácil aprender Haskell una vez que conoces los conceptos básicos de OCaml. O más bien, puede concentrarse en las cosas raras, y no tiene que asimilar lo básico al mismo tiempo.

Del mismo modo, una vez que haya visto OCaml, y posiblemente también Haskell, y aún quiera aprender más, debería mirar Coq o Agda. Sin embargo, pocos recomendarían Coq o Agda para una primera introducción a la programación funcional ...

Para aclarar mi punto de vista: creo que aprender OCaml (o SML) y luego Haskell lo convertirá en un programador funcional tan bueno como aprender Haskell directamente, pero con mayor facilidad (o menos dolorosamente).
Además, OCaml y Haskell tienen cosas buenas que los diferencian, y es interesante saber sobre las características avanzadas de ambos . Simplemente aprender que Haskell es más pobre en ese aspecto (aunque, por supuesto, podrías aprender OCaml después de Haskell; creo que es menos lógico y te hará sentir más frustrado).

Para aprender OCaml, recomendaría el borrador del libro de Jason Hickey (PDF) .

¹ esta definición es controvertida. Algunas personas de Scheme afirman que la escritura estática no tiene nada que ver con la programación funcional. Algunas personas de Haskell afirman que su definición de pureza ("lo que hace Haskell, pero no más") es una condición sine qua non para ser un lenguaje funcional. Estoy de acuerdo en estar en desacuerdo.


3
Gracias por empujarme hacia OCaml, y sí, arriesgaré mi alma y exploraré F #. Sí desarrollo para Linux, Mac OS X y Windows (principalmente el primero) pero FSI parece estar disponible para las tres plataformas (ejecutando mono en Linux y Mac OS X), lo cual ya hago. El hecho de que todo el peso de Microsoft esté detrás de un lenguaje de programación funcional (aunque sea "impuro") debería ser bien recibido en lugar de ser criticado por los fanáticos de la programación funcional.
haziz

SML está muerto, ocaml existe para escribir coq
permeakra

1
+1 para ML; Es más claro que Haskell.
m3th0dman

También me parece una buena idea aprender SML u OCaml, luego Haskell (+1). Después de conocer estos idiomas, elegir otro (por ejemplo, Scala) es muy fácil. Además, uno podría mirar Scheme, Common Lisp y Clojure (en este orden), para tener una idea de los lenguajes dinámicos.
Giorgio

@haziz: Incluso cuando crean un buen software, Microsoft (o, para el caso, Oracle, etc.) sigue siendo un monopolista, con todas las malas prácticas involucradas, como bloqueo de clientes, formatos incompatibles, implementaciones incompatibles, etc.
Giorgio

26

Si está interesado en los conceptos más avanzados en programación funcional, vaya con Haskell. Hay un sistema de tipo apropiado y una estricta prohibición contra la mutación. Aún así, Haskell no es para los débiles de corazón.

Si solo desea una introducción al diseño funcional, vaya con Scheme. La sintaxis es mucho más fácil de aprender y leer. Sí permite la programación de procedimientos, pero simplemente disciplínese para no usar ningún procedimiento con un !al final del nombre.

Con Scheme, también puede leer la Estructura e Interpretación de los programas de computadora , que es la mejor introducción a los paradigmas de programación, sin dudas. Hay conferencias sobre el libro de MIT y Berkeley .


44
"La sintaxis es mucho más fácil de aprender y leer" es muy subjetiva.

66
@luqui: Cierto. Quizás 'regular' es una palabra mejor. Sin problemas de backticks, infijos, precedencia o asociatividad, solo paréntesis, muchos paréntesis infernales y tontos.
Hoa Long Tam

17

¡La respuesta correcta es, por supuesto, ambas! Entonces, es solo una cuestión de qué idioma abordar primero. Mi situación es idéntica a la tuya. Realmente disfruté inmensamente The Little Schemer. Definitivamente comprenderá las construcciones básicas de la programación funcional después de pasar por eso (¡y tendrá un lugar para colocar sus manchas de gelatina!)

Estoy cerca de un cuarto de Learn You a Haskell for Great good. Lo disfruto bastante también, pero los dos libros no podrían ser más diferentes. Learn You a Haskell tiene un enfoque muy tradicional para enseñar un idioma específico. El Little Schemer es específico de Scheme, obviamente, pero está mucho más interesado en enseñar los fundamentos de la programación funcional, no el lenguaje de Scheme.

Definitivamente recomiendo comenzar con The Little Schemer. Es menos práctico, pero más fundamental.


17

Mis dos centavos con respecto a la programación funcional es no quedar atrapado en un lenguaje en particular, sino aprender los conceptos clave de la programación funcional. Aprendí programación funcional al ser arrojado de cabeza a un proyecto en el que mi jefe insistía en que todo el desarrollo se realizara en APL. APL es un lenguaje de procesamiento de matriz funcional y está tan lejos de LISP, Haskell o de cualquier otro lenguaje de programación convencional como sea posible. La verdadera recompensa fue cuando descubrí que una vez que "asimilé" el paradigma de programación funcional y aprendí mentalmente a descomponer automáticamente un problema en un programa funcional, realmente ya no me sentí intimidado por los aspectos idiomáticos de otros lenguajes funcionales como Haskell, OCaml, Scheme, Scala y Clojure. YO'

Si tuviera que elegir un primer lenguaje funcional, probablemente elegiría Haskell o Steel Bank Common Lisp (SBCL). Para Haskell, leí Aprenda usted un Haskell ... , Haskell del mundo real , El camino de Haskell a la lógica, las matemáticas y la programación , y Perlas de diseño de algoritmos funcionales . Para CL, leí Land of Lisp , Paradigms of Artificial Intelligence Programming , y (si eres realmente duro) Let over Lambda . Puede mezclar y combinar todos esos libros para obtener una visión general de los enfoques y conceptos prácticos de programación funcional.

También consideraría aprender Clojure y Scala, ya que ambos son lenguajes funcionales muy buenos y muy expresivos por sí mismos (a pesar de lo que pueda decir FP Purist).


6

Estoy de acuerdo con el punto "aprender ambos", pero hay algunos puntos más que no se mencionaron hasta ahora. En primer lugar, si eres nuevo en la programación funcional y vas con Haskell, entonces debes enfrentar varias cosas nuevas además de FP: debes aprender a vivir en un entorno perezoso que puede requerir un esfuerzo considerable, y necesitas para tratar con un sistema de tipo "real" que puede estar muy lejos de lo que usa en C o C #.

Scheme, OTOH, tiene una sintaxis de aspecto extraño, pero no hay un sistema de tipo estático para aprender, y es un lenguaje estricto, por lo que las cosas son más familiares. Además, las implementaciones de Scheme tienden a ser muy maleables; por ejemplo, Racket lo lleva al extremo y proporciona una variante perezosa y una estáticamente tipada. Esto significa que puede comenzar con las cosas "fáciles" y familiarizarse con el uso de un lenguaje funcional, y más tarde puede crecer y usar la variante mecanografiada y la perezosa. Ahora deberían ser más fáciles, ya que puedes lidiar con una característica a la vez. Para ser claros, los conceptosserán lo suficientemente nuevos como para que el problema sintáctico sea menor y sobre todo irrelevante. En otras palabras, una vez que comience a llegar a los nuevos conceptos, estará lo suficientemente ocupado como para que la sintaxis simplemente desaparezca. (Y si realmente te importa la sintaxis, entonces la sintaxis de Haskell es algo que personalmente considero muy elegante, pero eso es porque también está muy lejos de tu sintaxis promedio C / C # / C ++).

Pero habiendo dicho todo eso, creo que también hay un buen punto para F #: dices que haces esto como algo secundario, pero cuando aprendas FP pronto querrás usar todas esas cosas buenas. El uso de F # significa que puede hacer más cosas "reales", ya que probablemente sea fácil abordar el mismo tipo de problemas con los que se enfrenta en su trabajo diario. Idealmente, llegarás a un punto en el que verías la ventaja de usar eso sobre, por ejemplo, C #, y usarlo en algún proyecto. Entonces, si bien tiene razón al no elegir F # solo porque le es más fácil acceder, debe considerarlo ya que no hay nada mejor que usar realmenteEstos nuevos conceptos. Por el contrario, si usa Scheme o Haskell y lo considera un lenguaje de juguete para su propósito (incluso si sabe que algunas personas lo usan para aplicaciones reales), nunca se tomará en serio todo el asunto de la PF. [Pero YMMV, se basa principalmente en observaciones subjetivas y puede variar mucho de una persona a otra.]


6

¿Hay alguna razón por la cual ML no sea una de tus opciones? Hay una buena cantidad de material introductorio disponible, incluidos libros y folletos de cursos. Si te gusta The Little Schemer también puedes disfrutar de The Little MLer. Finalmente, puede hacer fácilmente la transición a F # más tarde. (No es que esté llamando a Haskell o Scheme, idealmente aprender los tres).

Además, una palabra de advertencia sobre Emacs Lisp. No creo que Haskell o ML te preparen para ello. Un lenguaje Lispy como Scheme ayudará, pero todavía hay diferencias importantes, por ejemplo. Variables de ámbito dinámico. Las extensiones de Emacs, por su propia naturaleza, tienden a ser más imperativas que funcionales: se trata de alterar el estado del editor.


Gracias por empujarme hacia ML / OCaml, y sí, "arriesgaré mi alma" y exploraré F #. Sí desarrollo para Linux, Mac OS X y Windows (principalmente el primero) pero FSI parece estar disponible para las tres plataformas (ejecutando mono en Linux y Mac OS X), lo cual ya hago. El hecho de que todo el peso de Microsoft esté detrás de un lenguaje de programación funcional (aunque sea "impuro") debería ser bien recibido en lugar de ser criticado por los fanáticos de la programación funcional.
haziz

Por cierto, pedí The Little MLer de Amazon y ya lo recibí y comencé mi viaje. También acabo de agregar Learning F # a mi biblioteca. Parece ser una guía de enseñanza más convencional, que usaré para complementar The Little MLer.
haziz

6

Escriba un esquema en 48 horas (en Haskell)

Realmente recomiendo esto. Aprenderá a Haskell usando un problema real e interesante, y aprenderá la mejor lección de esquema jugando con el intérprete que construye. Si sigue esta ruta, tenga algunas buenas presentaciones de Haskell. Los comprenderá mejor si tiene un problema que resolver.


De hecho, utilicé este wiki / pdf para aprender Haskell y repasar mis habilidades OCaml (traduciendo Haskell idiomático a OCaml). Sería genial si alguien pudiera tomar este material y "bifurcarlo" para varios lenguajes funcionales. ¡Podría ser la base para un tiroteo de lenguaje funcional muy bueno!
Marc

1
El principal problema con esto es que introduce parsec sin introducir mónadas.
alternativa el

@alternative parsec tiene una interfaz Monadic, pero también tiene una interfaz aplicativa, sin mencionar muchas otras funciones. No es irrazonable presentar Parsec antes de la generalización monádica
Philip JF

4

Yo iría con Haskell. En el esquema, es posible que se le pida que haga cosas de procedimiento, y su sistema de tipos no es tan útil como el de Haskell, que es excelente para un principiante, ya que prácticamente comprueba que su código sea correcto en el momento de la compilación.


3
"más o menos verifica que su código sea correcto" está muy mal. Ningún sistema de tipos puede hacer eso. (A menos que su sistema de tipos sea un verdadero probador de teoremas).
Eli Barzilay

44
@Eli, ¿has usado Haskell? Si bien en teoría esta afirmación es obviamente falsa, en la práctica considero que es bastante precisa, al menos en comparación con cualquier otro idioma que haya usado. Dicho esto, en realidad no estoy de acuerdo con que esta sea una buena propiedad para un principiante. Cuando estoy aprendiendo las cuerdas, preferiría ver específicamente qué hizo mal mi código, en lugar de que el compilador me grite que está mal y tenga que luchar con eso cuando ni siquiera sé el vocabulario que están usando los mensajes de error.

1
@Eli "más o menos" es el término clave aquí. En Haskell pasas más tiempo pensando en cómo implementarlo, luego la implementación es bastante fácil. Luego, escríbalo para asegurarse de que sus mapas, pliegues, etc. estén sanos.
alternativa el

@Eli Barzilay: el sistema de tipos de Haskell parece estar muy cerca de ser un teorema. Ciertamente creó un entorno donde los demostradores de teoremas casi parecen más comunes que otras herramientas. (No es que esté implicando una relación causal.)
greyfade

@luqui - Sí, lo usé; no, sigue siendo una afirmación falsa, tanto en la práctica como en la teoría. Sin embargo, eso no es algo exclusivo de Haskell.
Eli Barzilay

1

Creo que es fácil quedar atrapado en debates sobre idiomas, y no entiendo. Para alguien que solo quiere saber de qué se trata FP, las diferencias entre Ocaml / ML / Scheme / Haskell no son la mitad de importantes que su comodidad con el material (libros, videos, herramientas) que usa para aprenderlo. Y si tiene o no un amigo que lo ayude a aprender cierto idioma, triunfa sobre todo lo demás.


0

Si no es puro, también puedes usar un lenguaje imperativo, entonces Haskell.


0

En una de las respuestas que recibió a su pregunta, este enlace me pareció bastante interesante, ya que le da una idea de Haskell y Scheme.

Además de ese ingenioso enlace, aquí está mi opinión sobre su pregunta.

Si viene de un entorno de programación imperativo, puede terminar poniendo mucho esfuerzo en aprender programación funcional. Me aseguraría de que la experiencia de aprendizaje no esté vacía. Es decir, puede aplicarlo a su trabajo actual o próximo o que lo ayudará de alguna otra manera.

Hay muchos buenos idiomas por ahí. La gente Scala ensalzaría su idioma, al igual que la gente de Clojure y CL. Incluso los pitonistas reclaman pereza. Otras personas que respondieron sugirieron ML. Amit Rathore, quien escribió Clojure en acción, incluso podría sugerirle que aprenda Haskell.

Mencionaste Windows y F #. ¿Te ayudará eso en tu posición actual? No sé nada sobre F #. ¿Es lo suficientemente funcional? Pregunto eso, porque IMHO Python tiene construcciones funcionales, pero no es como programar en Clojure.

Para resumir, aprenda un lenguaje funcional que sea "realmente" funcional y que al hacerlo tenga más sentido para su situación.


-2

Desde el punto de vista de un principiante relativo, le sugiero que no comience con SICP si decide el esquema, a menos que sus matemáticas sean bastante maduras. El libro y los videos están llenos de sutilezas y no son del todo intuitivos para alguien que comienza.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.