Haskell найбільш тісно пов'язаний із сімейством мов ML. Це , звичайно, включає такі речі, як OCaml , але також F # на платформі .NET. Ці мови діляться з Haskell основою системи типів і тим, як використовуються дані - алгебраїчні типи даних, відповідність шаблонів, умовиведення типу тощо. Звичайно, вони можуть суттєво відрізнятися від Haskell в інших моментах, звичайно - більшість ML є суворими і нечистими Для початку і популярність Haskell як транспортного засобу для дослідження типів систем та мовного дизайну означає, що більшість мов стилю ML мають тенденцію мати менш потужні (але потенційно простіші для розуміння) системи типів. Це, мабуть, сміливо сказати, що, хоча ви можете пропуститидеякі речі щодо Haskell, особливо спочатку, більшість програмістів Haskell, ймовірно, почуватимуться комфортно як вдома в ML, досить швидко, на базовому рівні виконання завдань. Якщо ви хочете мову з такою ж загальною структурою, як і Haskell, ML - це найкраща пропозиція.
Функціональна сторона Scalaтакож значною мірою витягує з традицій ML, а також використовує деякі особливості сучасного типу, знайомі з Haskell, а також більш стандартну систему OOP, інтегровану з вищезазначеним. Хоча ОО на мовах стилю ML, як правило, підходить як більше до "модельного OO з основними функціональними інструментами", Scala живе і дихає OO у стилі Java. Це має переваги для Java interop, як ви могли уявити, і представляє більш звичне робоче середовище для програмістів OO. Однак, виходячи з фону Haskell, ви, швидше за все, дратуєтесь способами, що змішування речей у Scala робить функціональні ідіоми незграбнішими, а більшість Java-API виявляються погано розробленими та непотрібними у використанні.
Нарешті, хоча це може здатися дивним, Clojure насправді має багато спільного з Haskell на більш філософському рівні. Більшість того, що ви знайдете у підході Clojure до стану та цінностей проти ідентичності , дуже близьке за духом до того, що Haskell формалізує через систему типів. Відповідно, Clojure в меншій мірі наголошує на інтеропі Java та не переживає з приводу перетягування OOP, тому певний підхід Clojure до функціонального програмування може бути найближчим до того, що ви вже знайомі. Я думаю, що це говорить з цього приводу, що, наскільки мені відомо, Clojure є єдиною мовою, крім Haskell, яка має реалізацію STMце просто, ефективно і просто працює. З іншого боку, Clojure походить від традиції Ліспа і, таким чином, не вистачає системи статичного типу та акцентується на алгебраїчних типах даних та узгодженні шаблонів, виявлених на мовах, що впливають на ML. І звичайно, це Lisp, який сам по собі є негативом для деяких людей (хоча я дійсно не знаю чому).
Якщо говорити про себе, з відмовою від того, що мій перший досвід функціонального програмування був у схемі, я, мабуть, схиляюся до Clojure, з OCaml, ймовірно, другим вибором.