Pregunta

Esta es la situación: principalmente programo C # y tengo tipos escritos que no quiero perder. Al mismo tiempo, me gustaría aprender programación funcional. La respuesta obvia, por supuesto, es F #.

Pero para todo, aparte de C #, uso emacs como editor, y realmente me gustaría aprender Lisp también. (Conozca el idioma de sus editores / IDE que conoce, por eso sé un poco de VB para escribir mis VS-macro en él) Y no es solo emacs, Lisp es algo que realmente quiero aprender.

En cuanto a F #, podría mezclarlo con C # sin ningún problema de interoperabilidad, tener una gran GUI (WPF) y muchas otras ventajas de .NET. Pero, por supuesto, no es tan maduro como Lisp.

Si soy realista, sé que si quiero pasar de contrabando un lenguaje funcional a mi vida profesional, debe ser F #. Dado que aprender dos idiomas completos parece un poco demasiado, esperaba que Lisp fuera una excelente manera de aprender programación funcional, y si empiezo F # más tarde, sería muy fácil ...

¿Es esto cierto? ¿O los dos idiomas no son comparables en absoluto?

¿Fue útil?

Solución

Lisp es una gran familia de lenguajes e implementaciones. El esquema, por ejemplo, es un dialecto de Lisp con probablemente más de cien implementaciones (aproximadamente diez de ellas ligeramente populares). Common Lisp es otro dialecto con aproximadamente diez implementaciones mantenidas actualmente. Scheme y Common Lisp tienen estándares escritos que las implementaciones intentan implementar.

F # es tanto un lenguaje como una implementación. de Microsoft. Fue derivado principalmente de OCAML y pertenece a la familia de lenguajes ML.

Lisp era un lenguaje muy temprano que soportaba programación funcional (Lisp 1.5 en los años 60). Muchos de los primeros experimentos con programación funcional se realizaron en Lisp. En los años 70 en la comunidad de Lisp hubo un movimiento hacia las raíces de la programación funcional y el resultado fue Scheme . Luego, especialmente en los años 80 y 90 del siglo pasado, aparecieron nuevos lenguajes funcionales (ML, Miranda, FP, SML, Haskell, Clean, ...) que eran / son muy diferentes de los dialectos habituales de Lisp. Todavía hay algo de herencia, pero en su mayoría se desarrollaron en diferentes direcciones (tipeo estático, inferencia de tipos, sistemas de módulos, lenguajes por lotes, tipos de datos algebraicos, evaluación diferida, pureza y más). La comunidad Scheme todavía tiene muchos contactos con la comunidad FP. Pero eso es todo.

Hay algunas ideas básicas de FP que se pueden aprender independientemente de un lenguaje de FP particular, pero generalmente F # es muy diferente de la mayoría de los dialectos de Lisp. La otra característica, que F # es compatible con el ecosistema .net (especialmente porque es una creación de Microsoft) no es tan compatible con los dialectos de Lisp.

Tampoco esperaría mucho beneficio de conocer un dialecto de Lisp restringido como Emacs Lisp para aprender F #.

Otros consejos

Creo que solo hay una pequeña "superposición" de lo que aprenderías a través de Common Lisp versus F #. La coincidencia es, creo, más o menos

  • Programación con 'cons-lists' como un tipo de datos fundamental común, a veces escribiendo funciones recursivas (especialmente recursivas de cola) en lugar de bucles
  • Algunos usos básicos de las funciones comunes de orden superior (por ejemplo, 'mapa': aplicar una función a cada valor de una lista)

Además de algunas de esas cosas básicas de programación funcional, creo que Common Lisp y F # están tan separadas entre sí como dos lenguajes 'funcionales' (no Haskell) convencionales. Lisp común es dinámico; F # está estáticamente escrito. Las formas sintácticas son completamente diferentes. Los tiempos de ejecución son completamente diferentes. Las bibliotecas son muy diferentes. Los sistemas de objetos son completamente diferentes.

Independientemente del orden en que los aprenda, creo que después de aprender uno todavía habrá un poco más para aprender en el otro (módulo de la pequeña superposición que describí anteriormente).

F # es más comparable a la familia de lenguajes ML, como SML y CAML. La sintaxis y las características son diferentes de Lisp.

Pero creo que aprender al menos un lenguaje funcional es realmente importante desde la perspectiva de la informática. Ser capaz de pensar de esa manera es bueno.

Y, diría, aprender un lenguaje más puramente funcional antes de comenzar F # sería una forma de adquirir buenos hábitos de programación funcional porque, si no lo hace, su código F # podría terminar siendo más OO y menos funcional, porque de ahí vienes.

En mi opinión, hay dos enfoques para aprender programación funcional:

  1. Usa un lenguaje funcional más puro como Lisp o Haskell que forzarán usted para salir de un procedimiento mentalidad de inmediato; o

  2. Utiliza un lenguaje funcional pragmático como F # que también ofrece más familiar, pero menos funcional, construcciones para ayudarlo a facilitar su acceso.

En cualquier caso, obtendrá más de la experiencia de aprendizaje si puede hacer algo útil con el idioma. Parece que tienes motivación para Lisp (Emacs) y F # (interoperabilidad .NET), así que echaría un vistazo a ambos y veré qué capta tu atención.

En última instancia, hay más valor en la comprensión de los conceptos de programación funcional (funciones de orden superior, sin efectos secundarios, recursividad de cola, etc.) que cualquier lenguaje. Y una vez que aprenda esos conceptos, será mucho más fácil aprender nuevos lenguajes y aplicar las técnicas en otros idiomas (como el C # cada vez más funcional). En ese sentido, puede estar interesado en Programación funcional para el mundo real .

Dos cosas importantes a considerar son:

  • LISP se escribe dinámicamente mientras que F # se escribe estáticamente.
  • LISP tiene macros integrados. F # no.

Aunque ambos se consideran funcionales y comparten muchas características comunes, también son diferentes. Aprender LISP sin duda lo convertirá en un mejor programador de F # y viceversa, pero aún así tendrá que aprender las peculiaridades de ambos para poder ser práctico en ellos.

Para poder interoperar con .NET, ciertamente elegiría F #, pero en aras de la belleza de la programación, también probaría LISP.

Ambos son lenguajes funcionales pero sintácticamente son muy diferentes. Eso significa que muchos de los conceptos serán similares y usted (como desarrollador de procedimientos) tendrá que hacer lo mismo para usarlos, pero son idiomas muy diferentes.

F # es un derivado de ML (que se considera, con todos sus derivados, para ser un lenguaje funcional impuro) mientras que Lisp es más antiguo y se considera que ser un "puro" lenguaje funcional.

La pureza de un lenguaje funcional es un tema fascinante y le recomendaría que lea Pureza del lenguaje y funciones sucias y limpias para comprender mejor el concepto:

  

Mucha gente habla de "puro"   lenguajes funcionales, donde '' puro ''   parece ser un sinónimo de "bueno".   Hay dos rasgos comunes   asociado con la definición de un   lenguaje funcional puro:

     
      
  1. las funciones no pueden tener efectos secundarios
  2.   
  3. una función llamada con cualquier argumento dado siempre devolverá lo mismo   valor.
  4.   

Solo soy nuevo en F #, pero estudié Lisp antes de F # y creo que fue muy útil para contextualizar F # tanto en el marco .NET como en la gama de lenguajes de programación.

Recomiendo encarecidamente ver al menos los primeros videos aquí:

http://groups.csail.mit. edu / mac / classes / 6.001 / abelson-sussman-lectures /

Estos le enseñan los conceptos básicos de Lisp dentro de la primera hora. La serie se basa en ese conocimiento e inculca los principios emocionantes que se desprenden de allí.

La semántica de F # y Scheme son muy similares, con la notable excepción del tipeo fuerte.

¡Además, Scheme es tan pequeño que no se aprende!

Como lenguaje de programación, Lisp es bastante especial por derecho propio, sin embargo, no es similar a F # en absoluto, excepto que ambos admiten programación funcional. No muchas construcciones de lenguaje se transfieren de Lisp a F #. Si quieres aprender lisp, hazlo. La idea de la programación funcional se trasladará, pero no la sintaxis. Lisp es muy viejo, de finales de los 50. Muchos idiomas han sido influenciados por él y hay bastantes dialectos.

Si solo estás buscando un lenguaje funcional puro para aprender antes de F #, te sugiero Haskell. Haskell fue fuertemente influenciado por ML y es un buen lenguaje de transición a F # ya que F # es un derivado de ML. Puede mirar el código Haskell y ver patrones similares en el código F #.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top