Haskell наиболее тесно связан с семейством языков ML. Это включает в себя такие вещи, как OCaml , конечно, но и F # на платформе .NET. Эти языки разделяют с Haskell основы системы типов и то, как используются данные - алгебраические типы данных, сопоставление с образцом, вывод типов и т. Д. Разумеется, они могут существенно отличаться от Haskell в других аспектах - большинство ML являются строгими и нечистыми Начнем с того, что популярность Haskell как средства исследования систем типов и дизайна языков означает, что большинство языков стиля ML имеют тенденцию иметь менее мощные (но потенциально более простые для понимания) системы типов. Можно с уверенностью сказать, что в то время как вы можете пропуститьнекоторые вещи о Haskell, особенно на первых порах, большинство программистов на Haskell, вероятно, чувствовали бы себя комфортно в ML довольно быстро, на базовом уровне достижения цели. Если вам нужен язык с такой же общей структурой, как у Haskell, лучше всего использовать ML.
Функциональная сторона ScalaТакже в значительной степени опирается на традицию ML, а также использует некоторые усовершенствованные функции системы типов, знакомые с Haskell, а также более стандартную систему ООП, интегрированную с вышеупомянутым. В то время как ОО в языках в стиле ML имеет тенденцию восприниматься как «модель ОО с базовыми функциональными инструментами», Scala живет и дышит ОО в стиле Java. Как вы можете себе представить, это имеет преимущества для взаимодействия с Java и предоставляет более знакомую рабочую среду для программистов ОО. Однако, исходя из опыта работы с Haskell, вы, скорее всего, будете раздражены тем, что смешивание вещей в Scala делает функциональные идиомы неуклюжими, а большинство API-интерфейсов Java плохо спроектированы и излишне сложны в использовании.
Наконец, хотя это может показаться странным, Clojure на самом деле имеет много общего с Haskell на более философском уровне. Большая часть того, что вы найдете в подходе Clojure к состоянию и ценностям и идентичностям , очень близка по духу тому, что Хаскель формализует через систему типов. Соответственно, Clojure делает упор на взаимодействие с Java в меньшей степени и не слишком беспокоится о перетаскивании в ООП, поэтому в некоторых отношениях подход Clojure к функциональному программированию сам по себе может быть ближе всего к тому, с чем вы уже знакомы. Я думаю, что это говорит о том, что, насколько мне известно, Clojure является единственным языком, кроме Haskell, который имеет реализацию STMэто просто, эффективно и просто работает. С другой стороны, Clojure происходит из традиции Лиспа и поэтому не имеет статической системы типов и акцентирует внимание на алгебраических типах данных и сопоставлении с образцом, которые встречаются в языках под влиянием ML. И, конечно, это Лисп, который сам по себе негативен для некоторых людей (хотя я действительно не знаю почему).
Говоря от себя, с отказом от ответственности, что мой первый опыт с функциональным программированием был в Scheme, я, вероятно, склонялся бы к Clojure, с OCaml, вероятно, вторым выбором.