Haskell jest najbardziej związany z rodziną języków ML. Dotyczy to oczywiście OCaml , ale także F # na platformie .NET. Języki te dzielą z Haskell podstawę systemu typów i sposób wykorzystania danych - algebraiczne typy danych, dopasowanie wzorców, wnioskowanie typów itp. Oczywiście mogą się znacznie różnić od Haskell w innych punktach - większość ML jest surowa i nieczysta , a na początku popularność Haskell jako narzędzia do badań nad systemami typów i projektowania języków oznacza, że większość języków w stylu ML ma zwykle słabsze (ale potencjalnie łatwiejsze do zrozumienia) systemy typów. Prawdopodobnie bezpiecznie jest powiedzieć, że możesz przegapićpewne rzeczy na temat Haskell, szczególnie na początku, większość programistów Haskell prawdopodobnie szybko poczuje się komfortowo w domu w ML, na podstawowym poziomie rzeczy do zrobienia. Jeśli chcesz języka o tej samej ogólnej strukturze co Haskell, ML jest najlepszym wyborem.
Funkcjonalna strona Scaliczerpie także mocno z tradycji ML, a także wprowadza zaawansowane funkcje systemu typowego znane z Haskell, a także bardziej standardowy system OOP zintegrowany z powyższym. Podczas gdy OO w językach w stylu ML jest zwykle traktowane jako „modelowy OO z podstawowymi narzędziami funkcjonalnymi” Scala żyje i oddycha OO w stylu Java. Jest to korzystne dla interakcji Java, jak można sobie wyobrazić, i oferuje bardziej znane środowisko pracy dla programistów OO. Jednak, pochodząc z tła Haskell, bardziej prawdopodobne jest, że zirytujesz się sposobami, w których mieszanie rzeczy w Scali sprawia, że funkcjonalne idiomy są nieporadne, a większość API Java jest źle zaprojektowana i niepotrzebnie trudna w użyciu.
Wreszcie, chociaż wydaje się to dziwne, Clojure ma wiele rzeczy wspólnych z Haskellem na bardziej filozoficznym poziomie. Większość tego, co znajdziesz w podejściu Clojure do stanu i wartości vs. tożsamości, jest bardzo zbliżona duchem do tego, co Haskell formalizuje poprzez system typów. Odpowiednio, Clojure w mniejszym stopniu kładzie nacisk na interakcję Java i nie martwi się tak bardzo o przeciąganie w OOP, więc w pewnym sensie podejście Clojure do samego programowania funkcjonalnego może być najbliższe temu, co już znasz. Myślę, że mówi w tym względzie, że o ile mi wiadomo, Clojure jest jedynym językiem oprócz Haskell, który ma implementację STMto proste, skuteczne i po prostu działa. Z drugiej strony Clojure wywodzi się z tradycji Lisp, a zatem brakuje mu statycznego systemu typów i nacisku na algebraiczne typy danych i dopasowanie wzorców występujące w językach wpływających na ML. I oczywiście jest to Lisp, co samo w sobie jest negatywne dla niektórych osób (choć tak naprawdę nie wiem dlaczego).
Mówiąc za siebie, z zastrzeżeniem, że moje pierwsze doświadczenie z programowaniem funkcjonalnym było w Scheme, prawdopodobnie skłaniam się ku Clojure, z OCaml prawdopodobnie drugim wyborem.