Para aquellos de ustedes con experiencia tanto en Haskell como en Lisp, tengo curiosidad por saber cuán "agradable" (para usar un término horrible) es escribir código en Haskell vs. Lisp.
Algunos antecedentes: estoy aprendiendo Haskell ahora, habiendo trabajado anteriormente con Scheme y CL (y una pequeña incursión en Clojure). Tradicionalmente, podrías considerarme un fanático de los lenguajes dinámicos por la brevedad y rapidez que brindan. Rápidamente me enamoré de las macros Lisp, ya que me dieron otra forma de evitar la verbosidad y la repetición.
Haskell me parece increíblemente interesante, ya que me presenta formas de codificación que no sabía que existían. Definitivamente tiene algunos aspectos que parecen ayudar a lograr la agilidad, como la facilidad para escribir funciones parciales. Sin embargo, estoy un poco preocupado por perder las macros Lisp (supongo que las pierdo; la verdad es que es posible que aún no las haya aprendido) y el sistema de escritura estática.
¿A alguien que haya hecho una cantidad decente de codificación en ambos mundos le importaría comentar cómo difieren las experiencias, cuál prefiere y si dicha preferencia es situacional?
fuente
En primer lugar, no se preocupe por perder características particulares como la escritura dinámica. Como está familiarizado con Common Lisp, un lenguaje notablemente bien diseñado, supongo que es consciente de que un lenguaje no se puede reducir a su conjunto de características. Se trata de un todo coherente, ¿no?
En este sentido, Haskell brilla tan intensamente como Common Lisp. Sus características se combinan para proporcionarle una forma de programación que hace que el código sea extremadamente corto y elegante. La falta de macros se mitiga un poco con conceptos más elaborados (pero, igualmente, más difíciles de entender y usar) como mónadas y flechas. El sistema de tipo estático aumenta su poder en lugar de interponerse en su camino como lo hace en la mayoría de los lenguajes orientados a objetos.
Por otro lado, la programación en Haskell es mucho menos interactiva que Lisp, y la enorme cantidad de reflexión presente en lenguajes como Lisp simplemente no encaja con la visión estática del mundo que presupone Haskell. Por lo tanto, los conjuntos de herramientas disponibles son bastante diferentes entre los dos idiomas, pero difíciles de comparar entre sí.
Personalmente, prefiero la forma de programación Lisp en general, ya que creo que encaja mejor con la forma en que trabajo. Sin embargo, esto no significa que esté obligado a hacerlo también.
fuente
Hay menos necesidad de metaprogramación en Haskell que en Common Lisp porque mucho se puede estructurar alrededor de mónadas y la sintaxis agregada hace que los DSL integrados se vean menos como árboles, pero siempre existe Template Haskell, como lo menciona ShreevatsaR , e incluso Liskell (Haskell semántica + Lisp sintaxis) si le gustan los paréntesis.
fuente
En cuanto a las macros, aquí hay una página en la que se habla de ello: Hola Haskell, Adiós Lisp . Explica un punto de vista donde las macros simplemente no son necesarias en Haskell. Viene con un pequeño ejemplo de comparación.
Caso de ejemplo en el que se requiere una macro LISP para evitar la evaluación de ambos argumentos:
Caso de ejemplo en el que Haskell no evalúa sistemáticamente ambos argumentos, sin la necesidad de nada como una definición de macro:
Y voilá
fuente
delay
no puede ser una función.accept
es el (E) DSL. Laaccept
función es análoga a la macro descrita en las páginas anteriores, y la definición dev
es exactamente paralela a la definición dev
Scheme en la diapositiva 40. Las funciones Haskell y Scheme calculan lo mismo con la misma estrategia de evaluación. En el mejor de los casos, la macro le permite exponer más de la estructura de su programa al optimizador. Difícilmente se puede afirmar esto como un ejemplo en el que las macros aumentan el poder expresivo del lenguaje de una manera que no se replica en una evaluación perezosa.automaton
convertirseletrec
,:
convertirseaccept
,->
convertirse en nada en esta versión). Lo que sea.Soy programador de Common Lisp.
Después de haber probado Haskell hace algún tiempo, mi resultado final personal era seguir con CL.
Razones:
Haskell tiene sus propios méritos, por supuesto, y hace algunas cosas de una manera fundamentalmente diferente, pero para mí no es suficiente a largo plazo.
fuente
dilbert = dogbert.hire(dilbert);
" ?? Dudo que muchos programadores de Haskell puedan siquiera leer esto sin moverse un poco.En Haskell puede definir una función if, lo cual es imposible en LISP. Esto es posible debido a la pereza, que permite una mayor modularidad en los programas. Este artículo clásico: Por qué es importante la FP de John Hughes, explica cómo la pereza mejora la composibilidad.
fuente
fold
, por ejemplo, mientras que las funciones no estrictas sí lo hacen .Hay cosas realmente interesantes que puedes lograr en Lisp con macros que son engorrosas (si es posible) en Haskell. Tomemos, por ejemplo, la macro "memoize" (véase el capítulo 9 del PAIP de Peter Norvig). Con él, puede definir una función, digamos foo, y luego simplemente evaluar (memoize 'foo), que reemplaza la definición global de foo con una versión memoizada. ¿Puede lograr el mismo efecto en Haskell con funciones de orden superior?
fuente
A medida que continúo mi viaje de aprendizaje de Haskell, parece que una cosa que ayuda a "reemplazar" las macros es la capacidad de definir sus propios operadores infijos y personalizar su precedencia y asociatividad. Un poco complicado, ¡pero un sistema interesante!
fuente