Haskell Y Lisp vs. Haskell O Lisp [cerrado]

40

Actualmente codifico con C, C ++ y Python. Quiero aprender un lenguaje de programación funcional, y en este momento me estoy inclinando hacia Haskell. NO quiero comenzar una guerra "Haskell vs Lisp" aquí; Lo que quiero saber es esto: si aprendo a Haskell principalmente por la exposición a la programación funcional, ¿qué beneficios obtendré, si los hubiera, de aprender Lisp más tarde?

Zeke
fuente
1
Y F # y Clojure.
cnd

Respuestas:

58

Sugiero aprender ambos, Haskell primero, luego Common Lisp. Mi experiencia con Haskell fue que la escritura estática parecía ser una molestia restrictiva al principio, pero una vez que me acostumbré, noté que la mayoría de mis errores tipográficos tenían errores lógicos ocultos detrás de ellos. Cuando llegue a este punto, y al próximo hito, que es aprender a pensar en tipos y definir sus propios tipos como un medio para expresar su solución, estará listo para Common Lisp.

Con Common Lisp, puede agregar mónadas, curry y todo lo que le gustó de Haskell, pero también obtiene herencia múltiple como mencionó Frank Shearar, y funciones genéricas con despacho múltiple y un sistema avanzado de manejo de excepciones.

Entonces, ¿por qué no aprender primero Common Lisp? Viniendo de un procedimiento y antecedentes de OOP, mi experiencia ha sido que realmente no entendía la programación funcional hasta que tuve que usarla exclusivamente. Una vez que la programación funcional sea cómoda, puede agregar el resto de las herramientas que Common Lisp pone a disposición y usar la herramienta que sea mejor para la tarea en cuestión.

Larry Coleman
fuente
66
Creo que lo logró: lo que hace que Haskell y Smalltalk sean tan útiles para aprender es su pureza.
Frank Shearar el
44
Estoy de acuerdo con la pureza que hace que aprender un idioma sea mucho más fácil. No podía entender el lenguaje funcional en sí mismo con LISP porque todo es posible en el lenguaje y tengo demasiados antecedentes imperativos. Pero en Haskell, no existen tales conceptos que interrumpan el aprendizaje.
Eonil
1
Es gracioso, he tenido la experiencia opuesta. Aprendí los puntos principales de la programación funcional a través de Scheme, mi primer idioma. Ocasionalmente pirateo Haskell e inevitablemente descubro que tengo que volver a aprender más del 90% de las cosas que sabía cada vez que salgo de Haskell por un tiempo. Dicho esto, Haskell es un lenguaje increíblemente rico, con una gran cantidad para enseñarte (muy a la fuerza). Tipos Tipos Tipos Tipos! Sigue los tipos!
Josh Infiesto
31

Y por favor.

Haskell te enseña lo más puro de FP, al menos que yo sepa, al igual que Smalltalk enseña lo más puro de OO. (Menciono esto no para sugerir que OO y FP no pueden casarse, sino porque ambos lenguajes son "gemas", una idea central llevada a extremos).

Lisp es realmente una familia de idiomas, así que hablaré sobre Common Lisp porque ese es el miembro particular de la familia que uso.

Lisp todavía tendrá mucho que enseñarte:

  • Es multiparadigma, por lo que, como señala dsimcha , le mostrará cómo integrar FP con otros paradigmas.
  • Lisp le enseñará que "código-es-datos, datos-es-código", por ejemplo a través de sus macros.
  • CLOS es una marca muy interesante de OO, con herencia múltiple que funciona y funciones genéricas.
Frank Shearar
fuente
11

Aprender Lisp más adelante te permitirá personalizar Emacs, que posiblemente sea el editor de texto más avanzado disponible. No puedes hacer eso en Haskell.


fuente
14
[Afina sus paréntesis]
Inaimathi
66
Tal vez alguien pueda escribir un editor de texto para ello. Escuché que el sistema operativo Emacs no viene con uno. (Broma. Sé que puedes obtener el modo Viper. :)
greyfade
14
En realidad, hay un clon de Emacs llamado Yi, que usa Haskell exactamente de la misma manera que Emacs usa Lisp. De hecho, en comparación con (GNU) Emacs, Yi es aún más puro, porque su núcleo también está escrito en Haskell, mientras que los núcleos de Emacs generalmente no se escriben en Lisp. El kernel de GNU Emacs está escrito en C, JEmacs está escrito en Java, por ejemplo.
Jörg W Mittag el
2
@ Jörg, si se trata de una reimplementación parcial en lugar de un clon completo de GNU Emacs o XEmacs, no es lo mismo. Similar a comparar Word con Wordpad o Notepad.
1
@ Thorbjørn Ravn Andersen: Sí, pero no está tan mal. :)
greyfade
11

Haskell y Lisp son dos bestias totalmente diferentes.

Haskell es una especie de "programación puramente funcional en una torre de marfil"

Lisp es una especie de "código-es-datos / datos-es-código / crea tus propias construcciones de lenguaje". Puedes manipular tu código de cualquier forma que puedas imaginar.

Ellos son muy diferentes. Ambos comparten el aspecto de "programación funcional", pero ese es realmente un pequeño punto común en comparación con sus diferencias. ¡Pruébalos y verás lo diferentes que son!

dagnelies
fuente
+1: Buen punto. Conozco algunos Haskell y algunos Lisp. Aunque no soy un experto en ninguno de ellos, creo que tienes razón en que son muy diferentes. En Haskell no tienes la idea de usar datos como código. En Lisp no tiene coincidencia de patrón (AFAIK). Probablemente la lista (!) De diferencias es más larga.
Giorgio
7

El principal beneficio que veo al aprender Lisp es aprender a integrar FP en un lenguaje multiparadigm orientado al mundo real, en lugar de aprenderlo solo en el contexto de un lenguaje académico que enfatiza la pureza.

dsimcha
fuente
55
¡Supongo que sí quieres una guerra "Haskell vs Lisp"!
Don Roby el
3
Haskell es un lenguaje académico que enfatiza la pureza ... y mucha gente lo usa en el mundo real. Smalltalk también está en ese campamento.
Frank Shearar
¿Mucha gente usa Haskell en el mundo real?
Jon Harrop
1
@ Jon Harrop: Bueno, uso a Haskell en el mundo real (y funciona muy bien para ciertas aplicaciones), tal vez soy uno de los pocos (?)
Giorgio
5

También vengo de un fondo C / C ++ / Python y he probado FP un par de veces en los últimos años. Inicialmente miré a Haskell y no pude entenderlo, luego probé con Ocaml pero no fui mucho más lejos con eso. Finalmente comencé a escuchar cosas buenas sobre Scala, lo probé y descubrí que me quedaba muy bien (también había hecho un poco de Java en el pasado), hasta el punto de que después de un año de incursionar en Scala (y despachar 161) Project Euler tiene problemas con él), Haskell parece tener mucho más sentido. De hecho, acabo de pedir un par de libros sobre Haskell y quiero darle otra oportunidad, aunque esto está motivado en gran medida por la existencia de Scalaz.

Así que encontré que usar un lenguaje de paradigmas múltiples (es decir, Scala, pero Lisp probablemente también encajaría en la factura) es una buena forma de ingresar a la FP. Pero si eres feliz sumergiéndote en Haskell (no lo estaba), hazlo.

Timday
fuente
Es interesante que haya llegado más lejos con Scala que con OCaml. ¿Cómo?
Jon Harrop
@ Jon: Buena pregunta; Difícil de decir. Tal vez simplemente no estaba listo para "entrar" en funcionamiento en ese momento. Tal vez encontré un tutorial de Scala en el nivel correcto. Tal vez el linaje C / C ++ / Java de Scala lo hizo un poco menos extraño. Dado que cualquier apuesta racional en estos días estaría en F # en lugar de Scala, probablemente volveré a visitar el dominio OCaml en algún momento, aunque desde que incursioné en estas cosas solo por la pura alegría de entrar en una "mentalidad de programación" diferente a mi C ++ día de trabajo, tengo una inclinación perversa a volver a intentar Haskell nuevamente.
Timday
Enfoque de movimiento suave :)
Eonil
2

Originalmente provenía de un fondo C / C ++ / Ruby y usé conceptos de FP en Ruby siempre que pude. El estado me lastimó un poco el cerebro. Uno de mis amigos me llamó un día y me pidió que escribiera algo en Haskell (¡mi primer trabajo, y con suerte no el último, de Haskell!). Aprendí rápidamente el idioma y creé algo que funcionó. No era hermoso ni nada, pero funcionó.

Me tomé un descanso de un mes de Haskell porque no tenía nada para usarlo. Pero cuando decidí que necesitaba escribir mi propio software de blog, usé Haskell ( https://symer.io ). Haskell es realmente genial porque puede dividir un problema en partes e implementar estas partes de manera diferente según la entrada. Haskell también maneja las fallas extremadamente bien a través del boxeo inteligente de valores. Hay tantas herramientas para trabajar con estas cajas que simplemente olvida que existen.

Mi experiencia con lisp (Scheme) fue completamente negativa. El lenguaje no solo carecía de estas herramientas inteligentes y simples, sino que se sentía tan peligrosamente suelto como Ruby o JavaScript. Fue una experiencia horrible y no ofrece nada nuevo más allá de Ruby o Python.

C ++ no puede mantener una vela a Haskell, fuera de la administración de memoria. Haskell es igual de rápido (si no más rápido), significativamente más breve y mucho más seguro. Pero la seguridad de Haskell nunca se interpone.

TL; TR Haskell es un soplo de aire fresco, y Lisp es un Ruby un poco más funcional.

Nate Symer
fuente