¿Cuál es el lenguaje de producción más compatible y ampliamente utilizado para exportar los conocimientos y habilidades adquiridos de Haskell?

14

Me gusta Haskell, simple y llanamente. Si bien Haskell se usa en software de producción, no se despliega especialmente de lo que he visto. ¿Cuál es el lenguaje más similar y aún más utilizado en lo que respecta a los proyectos de producción para que tenga la posibilidad de usar algo similar en la industria?

¿También está disponible el mismo idioma de la primera parte en un gran número de plataformas? Si no, ¿cuál es la mejor alternativa que tiene una implementación de plataforma amplia? Me gustaría incluir un solo idioma en mi lista de tareas pendientes en lugar de un enjambre o familia masiva. La evidencia sólida sería una ventaja.

Ingeniero mundial
fuente

Respuestas:

21

Haskell está más estrechamente relacionado con la familia de idiomas ML. Esto incluye cosas como OCaml , por supuesto, pero también F # en la plataforma .NET. Estos lenguajes comparten con Haskell la base del sistema de tipos y cómo se usan los datos: tipos de datos algebraicos, coincidencia de patrones, inferencia de tipos, etc. Pueden diferir sustancialmente de Haskell en otros puntos, por supuesto, la mayoría de los NM son estrictos e impuros , para empezar, y la popularidad de Haskell como vehículo para la investigación en sistemas de tipos y diseño de idiomas significa que la mayoría de los lenguajes de estilo ML tienden a tener sistemas de tipos menos potentes (pero potencialmente más fáciles de entender). Probablemente sea seguro decir que, si bien puede fallarAlgunas cosas sobre Haskell, particularmente al principio, la mayoría de los programadores de Haskell probablemente se sentirían cómodamente en casa en un ML bastante rápido, en un nivel básico de hacer las cosas. Si desea un idioma con la misma estructura general que Haskell, un ML es su mejor opción.

El lado funcional de Scalatambién se basa en gran medida en la tradición de ML, y también incorpora algunas características avanzadas del sistema de tipos familiares de Haskell, así como un sistema OOP más estándar integrado con lo anterior. Mientras que OO en lenguajes de estilo ML tiende a ser considerado como un "modelo OO con herramientas funcionales básicas", Scala vive y respira OO estilo Java. Esto tiene beneficios para la interoperabilidad de Java, como se puede imaginar, y presenta un entorno de trabajo más familiar para los programadores de OO. Sin embargo, viniendo de un entorno de Haskell, es más probable que te molesten las formas en que mezclar las cosas en Scala hace que los modismos funcionales sean más torpes y que la mayoría de las API de Java estén mal diseñadas y sean innecesariamente difíciles de usar.

Finalmente, aunque puede parecer extraño considerarlo, Clojure en realidad tiene muchas cosas en común con Haskell a un nivel más filosófico. La mayor parte de lo que encontrará en el enfoque de Clojure sobre el estado y los valores frente a las identidades es muy cercano en espíritu a lo que Haskell formaliza a través del sistema de tipos. En consecuencia, Clojure enfatiza la interoperabilidad de Java en un grado menor y no se preocupa tanto por arrastrar a OOP, por lo que, de alguna manera, el enfoque de Clojure para la programación funcional en sí misma puede ser más cercano a lo que ya está familiarizado. Creo que es revelador a este respecto que, hasta donde sé, Clojure es el único lenguaje además de Haskell que tiene una implementación de STMeso es simple, efectivo y simplemente funciona. Por otro lado, Clojure proviene de la tradición de Lisp y, por lo tanto, carece del sistema de tipos estáticos y del énfasis en los tipos de datos algebraicos y la coincidencia de patrones que se encuentran en los lenguajes influenciados por ML. Y, por supuesto, es un Lisp, que en sí mismo es negativo para algunas personas (aunque realmente no sé por qué).

Hablando por mí mismo, con el descargo de responsabilidad de que mi primera experiencia con la programación funcional fue en Scheme, probablemente me inclinaría hacia Clojure, con OCaml como una probable segunda opción.

CA McCann
fuente
Se dice que F # se inspiró, si no se deriva de, OCaml. Una pregunta SO anterior, F # y OCaml , cubre una buena discusión de esa relación. Si está en el lado .NET, F # sería una excelente opción y Microsoft ahora considera a F # un lenguaje .NET de "primera clase". En el lado de JVM, Scala tiene un historial de uso industrial y Clojure parece estar aumentando en las listas. No conozco ninguna mejor opción en este momento, ya que el mercado aún no ha declarado un claro ganador en este espacio funcional de objetos.
John Tobler
4

Nunca lo usé yo mismo, pero veo que Scala aparece en blogs o descripciones de proyectos a veces y creo que tomó conceptos importantes de Haskell. Scala compila a la JVM y puede interoperar con Java.

Jürgen Strobel
fuente
3

Una alternativa funcional es Erlang . Si bien es un lenguaje muy concurrente, el subconjunto secuencial es un lenguaje funcional puro con muchas de las propiedades de los lenguajes funcionales, por ejemplo, cierres, datos inmutables y coincidencia de patrones. Se ejecuta en muchas plataformas, incluyendo Linux, varios Unix, Windows y Macosx. Ahora hay incluso una implementación en la JVM, erjang . Puede comunicarse fácilmente y coexistir con otros idiomas, así es como se usa a menudo.

Echa un vistazo al sitio principal .

rvirding
fuente
3

Clojure se usa cada vez más, y aunque no se parece a Haskell en un nivel superficial, si miras un poco más profundo, está claramente inspirado en Haskell y fomenta un estilo funcional muy similar.

Características clave de Clojure que los usuarios de Haskell pueden encontrar familiares y convincentes:

  • El lenguaje central es puramente funcional : si bien los efectos secundarios son posibles, se ocultan en lugares específicos (por ejemplo, referencias STM, funciones IO, interoperabilidad Java)
  • Todas las estructuras de datos son inmutables y persistentes.
  • Pereza : lograda en gran medida a través de las ubicuas secuencias perezosas de Clojure, esto resultará muy familiar para los usuarios de Haskell. Infinitas secuencias perezosas están bien.
  • Memoria transaccional de software : es la forma principal de manejar el estado mutable en Clojure. Vale la pena ver este excelente video donde Rich Hickey explica el enfoque de Clojure respecto de la identidad y el estado: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey

Diferencias clave (pueden ser positivas o negativas según su perspectiva):

  • Es impuro, aunque mi observación es que el estilo idiomático de Clojure es pegar funciones puras siempre que sea posible.
  • Escritura dinámica en lugar de estática (aunque las sugerencias de tipo estático se pueden usar opcionalmente para optimizaciones de rendimiento)
  • Es un lenguaje JVM con fácil acceso a todo el ecosistema de la biblioteca Java: esta es, en mi opinión, la mayor ventaja en términos de aplicabilidad en el mundo real
  • Sintaxis de Lisp. Entonces obtienes todos los beneficios de la homoiconicidad , a costa de tener que aprender a ver a través de todos los paréntesis :-)

Perspectiva personal: aprendí Haskell antes de Clojure, y amé a Haskell por su elegancia y pureza matemática. Clojure se inspira mucho y toma prestadas muchas características buenas de Haskell, pero es un lenguaje mucho más pragmático / práctico. Especialmente cuando cuenta el gran valor de poder aprovechar el ecosistema de la biblioteca de Java, entonces es un gran lenguaje para "hacer cosas".

mikera
fuente
1

Si te gusta Haskell, pero tienes que hacer un código para la JVM, libera puede ser interesante para ti. Está diseñado para estar lo más cerca posible de Haskell 2010, pero genera código Java.

Por supuesto, el frege en sí mismo no se parece en nada al "lenguaje de producción ampliamente utilizado" (recientemente publicado), pero Java sí lo es.

Ingo
fuente