Haskell est le plus étroitement lié à la famille de langues ML. Cela inclut des choses comme OCaml , bien sûr, mais aussi F # sur la plate-forme .NET. Ces langages partagent avec Haskell les fondements du système de types et la façon dont les données sont utilisées - types de données algébriques, correspondance de modèles, inférence de types, etc. , pour commencer, et la popularité de Haskell comme véhicule de recherche dans les systèmes de types et la conception de langage signifie que la plupart des langages de style ML ont tendance à avoir des systèmes de type moins puissants (mais potentiellement plus faciles à comprendre). Il est probablement prudent de dire que même si vous pouvez manquercertaines choses à propos de Haskell, en particulier au début, la plupart des programmeurs Haskell se sentiraient probablement à l'aise dans un ML assez rapidement, à un niveau de base. Si vous voulez un langage avec la même structure globale que Haskell, un ML est votre meilleur pari.
Le côté fonctionnel de Scalas'inspire également fortement de la tradition ML, et intègre également des fonctionnalités de système de type avancées familières à Haskell, ainsi qu'un système OOP plus standard intégré à ce qui précède. Alors que OO dans les langages de style ML a tendance à être considéré comme davantage un "modèle OO avec des outils fonctionnels de base", Scala vit et respire OO de style Java. Cela présente des avantages pour Java Interop, comme vous pouvez l'imaginer, et présente un environnement de travail plus familier pour les programmeurs OO. Cependant, venant d'un arrière-plan Haskell, vous êtes plus susceptible d'être ennuyé par les façons dont le mélange des choses dans Scala rend les idiomes fonctionnels plus maladroits et trouve la plupart des API Java mal conçues et inutilement difficiles à utiliser.
Enfin, même si cela peut sembler étrange à considérer, Clojure a en fait beaucoup de choses en commun avec Haskell à un niveau plus philosophique. La plupart de ce que vous trouverez dans l'approche de Clojure de l' état et des valeurs par rapport aux identités est très proche de ce que Haskell formalise à travers le système de type. En conséquence, Clojure met l'accent sur l'interopérabilité Java dans une moindre mesure et ne se soucie pas autant de glisser dans la POO, donc à certains égards, l'approche de Clojure de la programmation fonctionnelle elle - même peut être la plus proche de ce que vous connaissez déjà. Je pense qu'il est révélateur à cet égard que, à ma connaissance, Clojure est la seule langue en plus de Haskell qui a une implémentation de STMc'est simple, efficace et ça marche. D'un autre côté, Clojure est issu de la tradition Lisp et n'a donc pas le système de type statique et l'accent sur les types de données algébriques et la correspondance de motifs trouvés dans les langages influencés par ML. Et bien sûr, c'est un Lisp, qui est en soi un point négatif pour certaines personnes (même si je ne sais vraiment pas pourquoi).
Pour ma part, avec l'avertissement que ma première expérience avec la programmation fonctionnelle était dans Scheme, je pencherais probablement vers Clojure, avec OCaml un deuxième choix probable.