Frage

Ich frage mich, ob ich weiterhin sollte F # oder Haskell OCaml oder wechseln Sie lernen.

Hier sind die Kriterien, die ich bin am meisten interessiert:

  • Longevity

    • Welche Sprache wird länger dauern? Ich will nicht, etwas lernen, die von Benutzern und Entwicklern in ein paar Jahren aufgegeben werden könnten.
    • Will Inria, Microsoft, University of Glasgow weiterhin ihre jeweiligen Compiler für lange Sicht unterstützen?
  • Praktikabilität

    • Artikel wie this machen mir Angst Haskell zu verwenden. Eine Hash-Tabelle ist die beste Struktur für den schnellen Abruf. Haskell Befürworter dort vorschlagen Data.Map verwendet, die ein binärer Baum ist.
    • Ich mag es nicht zu einem sperrigen .NET Framework gebunden, es sei denn die Vorteile sind groß.
    • Ich möchte in der Lage sein, mehr zu entwickeln als nur Parser und Mathe-Programme.
  • übersichtlich

    • Ich mag meine Sprachen konsistent sein.

Bitte unterstützen Sie Ihre Meinung mit logischen Argumenten und Zitaten aus Artikeln. Danke.

War es hilfreich?

Lösung

  

Longevity

  • Haskell ist de facto die dominierende Sprache der funktionellen Programmierung Forschung. Haskell 98 wird für viele Jahre in stabiler Form halten und etwas namens Haskell kann 10 bis 30 Jahre dauern --- obwohl die Sprache zu entwickeln, wird sich fortsetzen. Die Gemeinde hat eine große Investition in Haskell und auch wenn die Haupt GHC Entwickler von einem Bus morgen getroffen werden (die berühmte „Busfehler in Cambridge“ -Problem), es gibt viele andere, die verstärkt auf die Platte kann. Es gibt auch andere, weniger aufwendige Compiler.

  • Caml wird von einer kleinen Gruppe an INRIA, das Französisch nationalen Labor kontrolliert. Sie haben auch eine bedeutende Investition, andere auch in Caml investiert werden, und der Code ist Open Source, und der Compiler ist nicht zu kompliziert, so dass wird auch für eine lange Zeit aufrechterhalten werden. Ich sage voraus, Caml wird viel stabiler als Haskell, da die INRIA Leute nicht mehr erscheinen für die Erforschung neue Sprache Ideen, es als ein Fahrzeug sein (oder zumindest sie tun dies auf einer kleineren Rate als in der Vergangenheit).

  • Wer weiß, was ein Unternehmen tun? Wenn F # erfolgreich ist, könnte Microsoft es seit 20 Jahren unterstützt. Wenn es nicht erfolgreich ist, könnte sie den Stecker in 2012 ziehe ich nicht erraten kann und wird es nicht versucht.

  

Praktikabilität

     
    

Eine Hash-Tabelle ist die beste Struktur für den schnellen Abruf. Haskell Befürworter dort vorschlagen, mit Data.Map, die ein binärer Baum ist.

  

Es hängt davon ab, was Sie suchen. Wenn Sie Ihre Schlüssel sind Strings, ternären Suchbäume als Tabellen Hash oft schneller sind. Wenn Sie Ihre Schlüssel ganze Zahlen sind, Okasaki und Gill binäre Patricia Bäume sind im Wettbewerb mit Hashing. Wenn Sie wirklich wollen, können Sie eine Hash-Tabelle in Haskell mit dem IO Monade bauen, aber es ist selten zu müssen.

Ich denke, es wird immer eine Leistungseinbuße für lazy evaluation sein. Aber „praktisch“ ist nicht dasselbe wie „so schnell wie möglich“. Die folgenden Aussagen wahr sind über die Leistung:

  • Am einfachsten ist es, die Zeit und Raum Verhalten eines Caml Programms zu prognostizieren.

  • F # ist in der Mitte (der wirklich weiß, was .NET und der JIT tun?).

  • Es ist am schwersten, die Zeit und Raumverhalten von Haskell-Programmen zu prognostizieren.

  • Haskell hat die besten Profilierwerkzeuge, und auf lange Sicht, das ist, was die beste Leistung ergibt.

  

Ich möchte in der Lage, mehr zu entwickeln, als nur Parser und Mathe-Programme.

Für eine Vorstellung von der gleichen Größenordnung wie in Haskell möglich ist, überprüfen Sie den xmonad Window-Manager und die Vielzahl ofpackages unter hackage.haskell.org .

  

Ich mag es nicht zu einem sperrigen .NET Framework gebunden, es sei denn die Vorteile sind groß.

Ich kann nicht sagen:

  

übersichtlich

     
    

Ich mag meine Sprachen konsistent sein.

  

Einige Punkte, auf die Konsistenz bewerten:

  • Haskells konkrete Syntax ist sehr gut entwickelt; Ich bin ständig auf der gute Arbeit von dem Haskell Ausschuss getan beeindruckt. OCaml Syntax ist in Ordnung, aber leidet im Vergleich. F # gestartet von Caml Kernsyntax und hat viele Ähnlichkeiten.

  • Haskell und OCaml beide haben sehr konsequent Geschichten über Betreiber Überlastung. Haskell hat einen konsistenten und leistungsfähigen Mechanismus Sie selbst erweitern können. OCaml hat keine Überlastung jeglicher Art.

  • OCaml hat dieeinfachste System, vor allem wenn Sie nicht schreiben Objekte und functors (die viele Caml Programmierer dies nicht tun, obwohl es mir verrückt scheint nicht functors zu schreiben, wenn Sie ML gerade schreiben). Haskell Typ-System ist ehrgeizig und leistungsstark, aber es wird ständig verbessert, was bedeutet, dass eine Inkonsistenz als Folge der Geschichte. F # im Wesentlichen die .NET-Typ-System verwendet, und ML-wie Hindley-Milner-Polymorphismus (Frage Siehe "Was ist Hindley -Milner ".)

  • OCaml ist nicht ganz konsequent, ob sie denkt Varianten sollten statisch oder dynamisch typisierte eingegeben werden, so dass es bietet sowohl ( „algebraische Datentypen“ und „polymorphe Varianten“). Die sich ergebende Sprache hat viel Ausdruckskraft, die für Experten groß, aber Konstrukt, das zu verwenden ist nicht immer offensichtlich für den Amateur.

  • OCaml die Reihenfolge der Auswertung ist offiziell nicht definiert, was ein schlechtes Design Wahl in einer Sprache mit Nebenwirkungen. Schlimmer noch, sind die Implementierungen inkonsistent. Die bytecoded virtuelle Maschine verwendet einen Auftrag und die native-Code-Compiler verwenden die andere

Andere Tipps

  

Wenn Sie lernen F # oder Haskell, wenn Sie OCaml wissen?

Ich glaube, die Antwort ist eindeutig ja, im Idealfall sollten Sie alle drei Sprachen lernen, weil jeder etwas zu bieten hat, aber F # ist das einzige mit einer bedeutenden Zukunft so, wenn man sinnvoll nur eine Sprache lernen, lernen F # durch Lesen mein von Visual F # 2010 für Technical Computing Buch oder abonnieren Sie unseren Das F # .NET Journal .

Longevity

Microsoft verpflichtet F # zu unterstützen, wenn sie es als Teil von Visual Studio 2010 im April veröffentlicht. So wird F # eine rosige Zukunft für mindestens ein paar Jahre garantiert. Mit einer leistungsstarken Kombination aus praktisch wichtigen Features wie ein hohe Leistung nativer Code REPL, High-Level für Parallelität Konstrukte eingebaut in .NET 4 und eine Produktionsqualität IDE-Modus, F # ist eine lang Art und Weise vor allen anderen funktionalen Programmiersprache in Bezug auf die reale Welt Anwendbarkeit jetzt. Ehrlich gesagt, niemand arbeitet auch auf alles, was mit F # in naher Zukunft zu konkurrieren könnte fähig sein. Mein eigene Open-Source- HLVM Projekt ist ein Versuch, dies zu tun, aber es ist bei weitem nicht bereit.

Im Gegensatz dazu sowohl OCaml und Haskell sind in extrem unproduktiv Richtungen entwickelt. Dies wurde für mehrere Jahre OCaml töten jetzt und ich erwarte, dass Haskell Anzug in den nächsten Jahren folgen. Die meisten ehemaligen Profis OCaml und Haskell Programmierer bewegten bereits auf F # (zum Beispiel Credit Suisse, Fliegen-Frosch Beratung) und die meisten des Restes werden zweifellos zu mehr praktischen Alternativen wie Clojure und Scala in naher Zukunft migrieren.

Insbesondere OCaml der QPL Lizenz sonst jemand verhindert seine wachsende Zahl von grundlegenden Konstruktionsfehler von der Festsetzung (16Mb String und Feldgrenzen auf 32-Bit-Maschinen, kein Shared-Memory-Parallelität, keine Werttypen, parametrischer Polymorphismus über Typ Löschung, interpretiert REPL , umständliche FFI etc.), weil sie davon abgeleitete Werke verteilen müssen nur in Form von Patches auf die ursprünglichen und den Debian-Paket-Maintainer verweigern Upstream eine Alternative zu bestätigen. Die neuen Funktionen der Sprache hinzugefügt werden, wie First-Class-Module in OCaml 3.12, ist bei weitem nicht so wertvoll wie Multicore-Fähigkeit gewesen wäre.

Es wurden einige Projekte in einem Versuch gestartet OCaml zu retten, aber sie erwies sich als zu wenig zu spät zu sein. Die parallel GC ist praktisch nutzlos und David Teller beenden Sie die Batterien Projekt (obwohl es in einer abgespeckte Form aufgenommen und freigegeben wurde). Folglich hat OCaml weg vom Sein der beliebtesten funktionalen Sprache 2007 starken Rückgang heute mit caml- Liste Verkehr nach unten über 50% seit 2007 .

Haskell hat weniger industriellen Anwender als OCaml und, obwohl es Multi-Core-Unterstützung bietet, ist es immer noch in einer sehr unproduktiv Richtung entwickelt. Haskell ist fast vollständig von zwei Menschen bei Microsoft Research in Cambridge (UK) entwickelt. Trotz der Tatsache, dass rein funktionale Programmierung für die Leistung von Design schlecht ist, weiterhin sie versuchen, Lösungen für die parallele Haskell auf Multicores Ziel zu entwickeln, wenn die großen Mengen an unnötigem Kopieren sie die Wand Speicher entstehen treffen und zerstören jede Hoffnung auf skalierbare Parallelität auf einem Multi-Core.

Der einzige große Nutzer von Haskell in der Industrie ist Galois mit rund 30 Vollzeit Haskell Programmierer. Ich bezweifle, sie lassen Haskell vollständig sterben, aber das bedeutet nicht, dass sie es in eine allgemein nützliche Sprache entwickeln wird.

Praktikabilität

Ich schrieb den Artikel, den Sie über Hash-Tabellen zitiert. Sie sind eine gute Datenstruktur. Andere Leute haben wie ternäre Bäume und Patricia Bäume zu rein funktionalen Alternativen bezeichnet, aber diese sind in der Regel ~ 10 × langsamer als Hash-Tabellen in der Praxis. Der Grund ist einfach, dass Cache-Misses Leistung betrifft heute dominieren und Bäume entstehen eine zusätzliche O (log n) Zeiger Indirekt.

Meine persönliche Präferenz ist für optionale Faulheit und optional Reinheit, da sowohl in der realen Welt im Allgemeinen kontraproduktiv sind (zum Beispiel Trägheit macht die Leistung und Speicherverbrauch wild unberechenbar und Reinheit verschlechtert stark durchschnittlichen Fall Leistung und macht die Interoperabilität einen Alptraum). Ich bin einer der wenigen Menschen ihren Lebensunterhalt vollständig aus der funktionalen Programmierung durch meine eigene Firma zu verdienen. Es genügt zu sagen, wenn ich dachte, Haskell lebensfähig wäre, würde ich in es vor Jahren diversifiziert haben, aber ich halte die Wahl nicht zu, weil ich glaube nicht, dass es wirtschaftlich rentabel ist.

Du hast gesagt, „Ich habe nicht zu einem sperrigen .NET-Framework ist gebunden wie es sei denn die Vorteile sind groß“. Die Vorteile sind enorm. Sie erhalten eine Produktionsqualität IDE, eine Produktionsqualität JIT-Compiler, der enorm effektive Optimierungen wie Typ-spezialisiert Generika, Produktionsqualität Bibliotheken für alles von GUI-Programmierung führt (siehe Game of life in 32 Zeilen von F # ) zu Zahlknirschens. Aber der wirkliche Nutzen von .NET, zumindest für mich, ist, dass Sie die Bibliotheken verkaufen können, die Sie in F # zu schreiben und viel Geld verdienen. Niemand hat jemals Bibliotheken zu OCaml und Haskell Programmierer erfolgreich verkaufen (und ich bin einer der wenigen Menschen, versucht zu haben), aber F # Bibliotheken bereits in nennenswerten Mengen verkauft. So ist der sperrige .NET-Framework ist es wert, wenn Sie durch das Schreiben Software Lebensunterhalt verdienen wollen.

Gut gestaltete

Diese Sprachen alle gut gestaltet, aber für verschiedene Zwecke. OCaml ist speziell für das Schreiben Theorembeweisern entworfen und Haskell ist speziell für die Erforschung von Haskell. F # wurde entwickelt, um alle der schwersten praktischen Probleme mit OCaml und Haskell wie schlechte Interoperabilität, fehlenden gleichzeitiger Garbage Collection und den Mangel an reifen modernen Bibliotheken wie WPF zu adressieren, um eine produktive moderne Sprache zu einem großen Publikum zugänglich zu machen.

Das war nicht zu Ihren Kriterien aber haben Sie Job Verfügbarkeit in Betracht gezogen? Haskell Liste derzeit 144 Arbeitsplätze auf tatsächlich Ocaml Liste 12 und C # Liste 26.000. Diese Zahlen sind nicht perfekt, aber ich wette, dass Sie, dass, sobald F # Schiffe es nicht lange dauern, bis es weht Vergangenheit Haskell und Ocaml in der Anzahl der Joblisten.

Bisher jede Programmiersprache in Visual Studios hat enthalten Tausende von Joblisten für sie. Mir scheint, dass, wenn Sie die beste Chance wollen eine funktionale Programmiersprache wie Ihr Job verwenden, dann F # wird es bald sein.

  

Longevity

Niemand kann die Zukunft vorhersagen, aber

  • OCaml und Haskell wurden für eine Reihe von Jahren surving gut, die gut für die Zukunft
  • ein gutes Omen
  • wenn F # Schiffe mit VS2010, wird MS gesetzlichen Verpflichtungen haben sie für mindestens 5 Jahre zu unterstützen
  

Praktikabilität

Perf: Ich habe nicht genug Erfahrung aus erster Hand mit Haskell, aber basierend auf Second-Hand-und dritte Hand Info, ich glaube, OCaml oder F # sind pragmatisch, in dem Sinne, dass ich denke, es ist unwahrscheinlich, dass Sie‘ ll in der Lage sein, die gleiche Laufzeitleistung in Haskell zu erhalten, die Sie in OCaml von F # tun.

Bibliotheken: Einfacher Zugriff auf das .Net Framework ist ein großer Vorteil von F #. Sie können es als sehen „um dieses sperrige Ding gebunden“ ist, wenn Sie so wollen, aber vergessen Sie nicht, dass „Sie Zugriff auf eine riesige sperrige Bibliothek von oft unglaublich nützliche Dinge haben“. Die ‚Verbindung‘ zu Net ist einer der großen Verkaufsargumente für F #. F # ist jünger und hat so weniger Bibliotheken von Drittanbietern, aber es ist bereits z FsCheck , FParsec , Gefälschte , und ein paar andere, in Zusätzlich zu den Bibliotheken "in der Box" auf .Net.

Tooling: Ich habe nicht genug persönliche Erfahrung zu vergleichen, aber ich denke, dass die VS-Integration mit F # zu etwas überlegen Sie für OCaml / Haskell heute finden (und F # wird auch weiterhin ein bisschen hier in den nächsten verbessern Jahr).

Ändern: F # ändert sich nach wie vor, wie es seine erste unterstützte Version in VS2010 annähert, so gibt es einige Bruch Änderungen Sprache / Bibliothek, die Sie müssen in naher Zukunft ertragen kann.

  

übersichtlich

Haskell ist auf jeden Fall schön und konsequent. Ich weiß nicht genug OCaml, aber meine Vermutung ist es ähnlich attraktiv ist. Ich denke, dass F # ‚größer‘ als jeder von denen ist, was bedeutet, mehr staubige Ecken und Inkonsistenzen (vor allem als Folge der die Impedanz Diskrepanz zwischen FP und .Net Vermittlung), aber insgesamt F # fühlt sich immer noch ‚sauber‘ zu mir, und dem Inkonsistenzen, die zumindest gut begründete / gemeinte.

existieren werden
  

Insgesamt

Meiner Meinung nach werden Sie in ‚guter Form‘ sein und jeden dieser drei Sprachen zu kennen. Wenn Sie ein großes langfristiges Projekt wissen möchten Sie es verwenden für, eine abheben kann, aber ich denke, viele der Fähigkeiten übertragbar sein wird (leichter zwischen F # und OCaml als zu / von Haskell, aber auch leichter unter jeder dieser drei als mit, sagen wir, Java).

Es gibt keine einfache Antwort auf diese Frage, aber hier sind einige Dinge zu beachten:

Haskell und OCaml sind beide reifen Sprachen mit starken Implementierungen. Tatsächlich gibt es mehrere gute Implementierungen von Haskell, aber ich glaube nicht, das ist ein wichtiger Punkt zu seinen Gunsten für Ihren Zweck.

F # ist viel jünger, und wer kann vorhersagen, wo Microsoft es nehmen entscheiden? Wie Sie das Gefühl, dass hängt mehr darüber, wie Sie Microsoft fühlen als alles, was jemand, den Sie über Programmiersprachen berichten.

OCaml (oder ML im Allgemeinen), ist eine gute praktische Sprache Wahl, die Sie kühlen funktionale Sachen unterstützt dabei ohne Zwang in einer Art und Weise zu arbeiten, das unangenehm sein könnte. Sie erhalten den vollen Nutzen von Dingen wie algebraische Datentypen, Pattern-Matching, Typinferenz und Lieblings Zeug alle anderen. Oh, und Objekte.

Haskell gibt Ihnen, dass alle (außer Objekte, so ziemlich), sondern auch alles, was man mehr oder weniger Kräfte zu überdenken Sie denken, Sie über die Programmierung kennen. Dies könnte eine sehr gute Sache sein, wenn Sie schauen, um etwas Neues zu lernen, aber es könnte mehr sein, als Sie abbeißen wollen. Ich sage das als jemand, der auf dem Weg zu sein, ein produktiver, glücklich Haskell Programmierer nur vielleicht auf halbem Weg ist.

Sowohl OCaml und Haskell verwendet werden viele verschiedene Arten von Programmen zu schreiben, nicht nur Compiler und AI oder was auch immer. Google ist dein Freund.

Eine letzte Anmerkung: OCaml gibt Sie hashtable, aber es ist kaum sinnvoll es im Code zu verwenden, wenn Sie wirklich funktionale Programmierung umarmen wollen. Persistent Bäume (wie Data.Map) sind wirklich die richtige Lösung für Haskell, und haben viele schöne Eigenschaften, die eine der coolen Dinge zu lernen, wann Sie Haskell abholen.

F # und OCaml sind sehr ähnlich in Syntax, aber offensichtlich, F # mit .NET besser ist.

Welche Sie lernen oder Verwendung sollte davon abhängig sein, welche Plattform Sie anstreben.

In VS2010 F # wird aufgenommen werden, und da es .NET-Bytecode kompiliert, kann es auf einem Windows-Betriebssystem verwendet werden, die .NET-Version unterstützen Sie darin. Dies gibt Ihnen eine große Fläche, aber es gibt Grenzen, die derzeit mit F #, die OCaml nicht haben, dass F # nicht alle Vorteile der Prozessoren auf einer Maschine zu nehmen scheint, aber das ist wahrscheinlich auf F # noch in der Entwicklung und dies kann ein Merkmal sein, das nicht so wichtig, doch ist.

Es gibt noch andere funktionale Sprachen wie Erlang, die Sie betrachten können, aber im Grunde, wenn Sie in einer FP Sprache stark sind, dann sollten Sie in der Lage sein, eine andere ziemlich schnell zu holen, so wählen Sie einfach eine, die Sie mögen und versucht, interessante und anspruchsvolle Anwendungen in der es zu entwickeln.

Schließlich Sprache Schriftsteller werden einen Weg finden, um OO-Sprachen arbeiten gut mit mehreren Kernen und FP kann wieder auf die Strecke bleiben, aber, die nicht in absehbarer Zeit zu sein scheint passiert.

Dies ist nicht direkt auf die Frage des OP bezogen, ob oder nicht F # lernen, sondern vielmehr ein Beispiel realer Welt OCaml Nutzung im Finanzsektor: http://ocaml.janestreet.com/?q=node/61

Sehr interessantes Gespräch.

In Bezug auf der Langlebigkeit, ist es sehr schwierig Popularität von Sprachen, um zu beurteilen, sondern nur eine schnelle Überprüfung auf hier zu tun, das sind die Zahlen von Fragen mit der entsprechenden (funktionalen) Sprache markiert: -

2672 Scala, 1936 Haskell, 1674 F #, 1126 Clojure,  709 Scheme,  332 OCaml

Ich würde sagen, dass dies ein guter Indikator für welche Sprachen der Menschen im Moment aktiv zu lernen und daher könnten eine gute Anzeichen dafür sein, von denen diejenigen in den nächsten Jahren beliebt sein könnten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top