Haskell ist der ML-Sprachfamilie am nächsten verwandt. Dazu gehört natürlich OCaml , aber auch F # auf der .NET-Plattform. Diese Sprachen teilen mit Haskell die Grundlage des Typsystems und die Art und Weise, wie Daten verwendet werden - algebraische Datentypen, Mustererkennung, Typinferenz usw. Sie können sich natürlich in anderen Punkten erheblich von Haskell unterscheiden - die meisten MLs sind streng und unrein Zunächst einmal bedeutet die Popularität von Haskell als Forschungsinstrument für Schriftsysteme und Sprachdesign, dass die meisten ML-ähnlichen Sprachen in der Regel weniger leistungsfähige (aber möglicherweise besser verständliche) Schriftsysteme aufweisen. Es ist wahrscheinlich sicher zu sagen, dass, während Sie vermissen könnenEinige Dinge über Haskell, vor allem am Anfang, würden sich die meisten Haskell-Programmierer in einer ML wahrscheinlich ziemlich schnell wohlfühlen, wenn sie grundlegende Dinge erledigen. Wenn Sie eine Sprache mit der gleichen Gesamtstruktur wie Haskell wünschen , ist eine ML die beste Wahl.
Die funktionale Seite von Scalastützt sich auch stark auf die ML-Tradition und greift auch auf einige von Haskell bekannte fortschrittliche Systemmerkmale sowie ein standardisiertes OOP-System zurück, das in das oben Gesagte integriert ist. Während OO in ML-ähnlichen Sprachen eher als "Modell-OO mit grundlegenden Funktionswerkzeugen" betrachtet wird, lebt und atmet Scala OO im Java-Stil. Wie Sie sich vorstellen können, bietet dies Vorteile für Java Interop und eine vertraute Arbeitsumgebung für OO-Programmierer. Wenn Sie jedoch einen Haskell-Hintergrund haben, ärgern Sie sich mit größerer Wahrscheinlichkeit darüber, dass das Zusammenführen von Dingen in Scala die funktionalen Redewendungen ungeschickter macht und die meisten Java-APIs als schlecht gestaltet und unnötig schwierig zu verwenden sind.
Obwohl es seltsam erscheinen mag, hat Clojure tatsächlich eine Menge Dinge mit Haskell auf einer philosophischeren Ebene gemeinsam. Das meiste, was Sie in Clojures Herangehensweise an Zustand und Werte im Vergleich zu Identitäten finden, ist sehr ähnlich dem, was Haskell durch das Typensystem formalisiert. Entsprechend betont Clojure Java-Interop in geringerem Maße und kümmert sich nicht so sehr um das Ziehen in OOP, sodass Clojures Ansatz zur funktionalen Programmierung in gewisser Weise dem am nächsten kommt, mit dem Sie bereits vertraut sind. Ich denke, diesbezüglich ist es bezeichnend, dass Clojure meines Wissens die einzige Sprache neben Haskell ist, die eine Implementierung von STM hatDas ist einfach, effektiv und funktioniert einfach. Auf der anderen Seite stammt Clojure aus der Lisp-Tradition und verfügt daher nicht über das statische Typsystem und die Betonung der algebraischen Datentypen und der Musterübereinstimmung, die in ML-beeinflussten Sprachen zu finden sind. Und natürlich ist es ein Lisp, was sich für manche Leute negativ auswirkt (obwohl ich wirklich nicht weiß warum).
Wenn ich für mich selbst spreche, mit dem Hinweis, dass meine erste Erfahrung mit funktionaler Programmierung im Schema lag, würde ich mich wahrscheinlich Clojure zuwenden, wobei OCaml wahrscheinlich die zweite Wahl ist.