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.