Was ist die am besten kompatible und am weitesten verbreitete Produktionssprache, um die von Haskell erworbenen Kenntnisse und Fähigkeiten zu exportieren?


14

Ich mag Haskell, schlicht und einfach. Während Haskell in Produktionssoftware verwendet wird, ist es nach meinem Kenntnisstand nicht besonders weit verbreitet. Was ist die ähnlichste und nach wie vor am häufigsten verwendete Sprache in Bezug auf Produktionsprojekte, damit ich die Chance eines Schneeballs habe, etwas Ähnlich Fantastisches in der Industrie einzusetzen?

Ist dieselbe Sprache aus dem ersten Teil auch auf einer großen Anzahl von Plattformen verfügbar? Wenn nicht, was ist die beste Alternative für eine breite Plattformbereitstellung? Ich möchte lieber eine einzige Sprache auf meine To-Do-Liste setzen, als einen riesigen Schwarm oder eine große Familie. Harte Beweise wären von Vorteil.

Antworten:


21

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.


F # wurde angeblich von OCaml inspiriert, wenn nicht von OCaml abgeleitet. Eine frühere SO-Frage, F # und OCaml , deckt eine gute Diskussion dieser Beziehung ab. Wenn Sie auf der .NET-Seite sind, wäre F # eine ausgezeichnete Wahl, und Microsoft betrachtet F # jetzt als eine "erstklassige" .NET-Sprache. Auf der JVM-Seite hat Scala eine Erfolgsgeschichte in der industriellen Nutzung und Clojure scheint in den Charts auf dem Vormarsch zu sein. Ich kenne derzeit keine einzige beste Wahl, da der Marktplatz noch keinen klaren Gewinner in diesem objektfunktionalen Raum ausgemacht hat.
John Tobler

4

Ich habe es selbst nie benutzt, aber ich sehe, dass Scala manchmal in Blogs oder Projektbeschreibungen auftaucht, und ich glaube, es hat wichtige Konzepte von Haskell übernommen. Scala wird bis zur JVM kompiliert und kann mit Java zusammenarbeiten.


3

Eine funktionale Alternative ist Erlang . Obwohl es sich um eine sehr konkurrierende Sprache handelt, handelt es sich bei der sequentiellen Teilmenge um eine reine Funktionssprache mit vielen Eigenschaften von Funktionssprachen, z. B. Closures, unveränderlichen Daten und Pattern Matching. Es läuft auf vielen Plattformen, einschließlich Linux, verschiedenen Unixen, Windows und MacOSX. Es gibt jetzt sogar eine Implementierung für die JVM, erjang . Es kann leicht mit anderen Sprachen kommunizieren und koexistieren, so wird es oft verwendet.

Schauen Sie sich die Hauptseite an .


3

Clojure wird immer häufiger verwendet, und obwohl es auf oberflächlicher Ebene nicht wie Haskell aussieht, ist es, wenn Sie ein bisschen tiefer schauen, eindeutig stark von Haskell inspiriert und fördert einen sehr ähnlichen funktionalen Stil.

Wichtige Clojure-Funktionen, die Haskell-Benutzer möglicherweise kennen und ansprechen:

  • Die Kernsprache ist rein funktional - Nebenwirkungen sind zwar möglich, sie sind jedoch an bestimmten Stellen verborgen (z. B. STM-Referenzen, E / A-Funktionen, Java-Interoperabilität).
  • Alle Datenstrukturen sind unveränderlich und persistent
  • Faulheit - wird hauptsächlich durch die allgegenwärtigen faulen Sequenzen von Clojure erreicht und kommt den Haskell-Benutzern sehr bekannt vor. Unendlich faule Sequenzen sind in Ordnung.
  • Software-Transaktionsspeicher - ist die Hauptmethode für den Umgang mit veränderlichen Zuständen in Clojure. Sehenswert ist dieses hervorragende Video, in dem Rich Hickey Clojures Ansatz zu Identität und Status erklärt: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey

Hauptunterschiede (können positiv oder negativ sein, abhängig von Ihrer Perspektive):

  • Es ist unrein - obwohl ich beobachte, dass der idiomatische Clojure-Stil darin besteht, reine Funktionen zu übernehmen, wo immer dies möglich ist.
  • Dynamische statt statische Typisierung (obwohl statische Typhinweise optional für Leistungsoptimierungen verwendet werden können)
  • Es ist eine JVM-Sprache mit einfachem Zugriff auf das gesamte Java-Bibliotheks-Ökosystem - dies ist meiner Meinung nach der größte Vorteil in Bezug auf die Anwendbarkeit in der Praxis
  • Lisp-Syntax. So erhalten Sie alle Vorteile der Homoikonizität , auf Kosten des Lernens, alle Klammern zu durchschauen :-)

Persönliche Perspektive: Ich habe Haskell vor Clojure gelernt und Haskell wegen seiner Eleganz und mathematischen Reinheit geliebt. Clojure schöpft viel Inspiration und leiht sich viele gute Features von Haskell, ist aber eine viel pragmatischere / praktischere Sprache. Vor allem, wenn Sie den enormen Wert der Nutzung des Java-Bibliotheks-Ökosystems schätzen, ist dies eine großartige Sprache für die Erledigung von Aufgaben.


1

Wenn Sie Haskell mögen, aber Code für die JVM erstellen müssen, könnte frege für Sie interessant sein. Es ist so konzipiert, dass es Haskell 2010 möglichst nahe kommt, generiert jedoch Java-Code.

Natürlich ist frege an sich nichts anderes als "weit verbreitete Produktionssprache" (die erst kürzlich veröffentlicht wurde), aber Java ist es mit Sicherheit.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.