F # ist von OCaml abgeleitet, aber welche wichtigen Elemente fehlen oder werden hinzugefügt? Insbesondere bin ich gespannt, ob die verfügbaren Ressourcen zum Erlernen von OCaml auch für jemanden nützlich sind, der F # lernen möchte.
F # ist von OCaml abgeleitet, aber welche wichtigen Elemente fehlen oder werden hinzugefügt? Insbesondere bin ich gespannt, ob die verfügbaren Ressourcen zum Erlernen von OCaml auch für jemanden nützlich sind, der F # lernen möchte.
Antworten:
Die Hauptunterschiede sind, dass F # nicht unterstützt:
Darüber hinaus hat F # eine andere Syntax für beschriftete und optionale Parameter.
Theoretisch können OCaml-Programme, die diese Funktionen nicht verwenden, mit F # kompiliert werden. Das Erlernen von OCaml ist eine durchaus vernünftige Einführung in F # (und umgekehrt, würde ich mir vorstellen).
Die vollständige Liste der Unterschiede finden Sie hier (Hinweis: archive.org ersetzt toten Link).
Diese Frage wurde schon seit einiger Zeit beantwortet, aber ich war ziemlich überrascht, dass die meisten Antworten sagen, welche OCaml-Funktionen in F # fehlen - dies ist auf jeden Fall gut zu wissen, wenn Sie vorhandene OCaml-Programme auf F # portieren möchten (was wahrscheinlich das ist Motivation der meisten Artikel, auf die verwiesen wird). Es gibt jedoch viele Funktionen, die F # zu einer anderen Sprache machen (nicht nur eine eingeschränkte Version von OCaml für .NET!). Hier sind einige Dinge, die in F # hinzugefügt werden:
+
für alle numerischen Typen sowie für Ihre Typen, die dies unterstützen, verwenden.Und ehrlich gesagt denke ich, dass es auch erwähnenswert ist, die Visual Studio IDE zu erwähnen. Dies ist kein Teil der Sprache, verbessert jedoch die Benutzererfahrung (die IntelliSense-Unterstützung in Visual Studio ist wirklich gut!).
Wenn Sie sich die Liste ansehen, gibt es viele Dinge, die maßgeblich zur Popularität von F # beigetragen haben. Es ist also viel mehr als nur "OCaml ohne Funktoren". F # basiert definitiv auf OCaml (und nimmt Ideen aus anderen Sprachen wie Haskell auf) und teilt viele Aspekte mit ihnen, aber es gibt auch viele andere Dinge. Ich denke, dass die Microsoft Developer Division ohne asynchrone Workflows, OO im .NET-Stil und Metaprogrammierung niemals F # in Visual Studio 2010 aufnehmen würde.
<@ a @>
, geschweige denn Typdefinitionen wie <@ type t = int @>
und es kann keine beliebigen Grammatiken verarbeiten , geschweige denn erweiterbare Lexer und Parser wie Camlp4. Das Fehlen eines anständigen Makrosystems ist ein Mangel, aber meiner Meinung nach ist das Fehlen anständiger Lexer und Parser für F # ein weitaus schwerwiegenderes Hindernis. Ich rate Entwicklern, ihre Lexer und Parser mit OCaml zu erstellen, sich auf die von F # unterstützte Teilmenge zu beschränken und sie zurück auf F # zu portieren, um von der überlegenen Toolunterstützung von OCaml zu profitieren!
Ich beschreibe F # immer als Cousin von OCaml, weil OCaml viele Funktionen hat, die F # nicht hat und wahrscheinlich nie bekommen wird. F # ist enger mit der vorherigen CAML-Sprache verwandt. Insbesondere unterstützt F # die Abstraktion nur sehr begrenzt und die strukturelle Typisierung (wie OCamls Objekte und polymorphe Varianten ) überhaupt nicht.
Im Gegensatz zu dem, was einige Befragte geschrieben haben, unterstützt F # (eingeschränkt) beschriftete ("benannte") und optionale Argumente.
Dies sind jedoch alles erweiterte Funktionen, und Sie können mit Sicherheit beginnen, sich mit den Grundideen einer kleinen funktionalen Programmierung im OCaml-Stil vertraut zu machen, indem Sie Ressourcen zu OCaml verwenden. Der erste große Unterschied, den Sie entdecken werden, sind größere Probleme wie Kapselung und Abstraktion, die in OCaml und in F # auf völlig unterschiedliche Weise gelöst werden. Wenn Sie lernen möchten, wie das in F # geht, ist die einzige verfügbare Literatur dieser Artikel über rein funktionale Datenstrukturen .
Ich habe auch festgestellt, dass das wunderbare Modulsystem von OCaml es einfach macht, Code über Typen (wie Datenstrukturen) zu parametrisieren, aber die OOP-Alternativen sind in .NET nicht nur abscheulich, sondern fast völlig unbenutzt. Außerdem habe ich beim Versuch, elegant parametrisierte Datenstrukturen zu schreiben, Dutzende von Fehlern im F # -Compiler festgestellt, weil noch nie jemand versucht hat, dies zu tun. Die F # stdlib enthält einige nette Datenstrukturimplementierungen, aber praktisch keine Wiederverwendung, dh es handelt sich um einen Cut'n'Paste-Job.
F # und OCaml sind taxonimische Klassen in der ML-Sprachfamilie, zu der auch eine ganze Reihe anderer seltsamer Tiere gehört. F # ist neuer als OCaml und hat noch weder Funktoren [Funktionen des Moduls -> Modul] noch Zeilentypen [Objektklassen und polymorphe Varianten]. Diese beiden Vereinfachungen erleichtern wahrscheinlich die Lernkurve für jemanden, der sich auf der .Net-Plattform entwickelt. Leider sind diese beiden Sprachfunktionen in OCaml äußerst leistungsfähig. Das Lesen der OCaml-Literatur, um Einblicke in das Codieren von F # zu erhalten, führt wahrscheinlich zu vorzeitiger Frustration mit letzterem, wenn es wahrscheinlich eine hervorragende Alternative zu C # ist, wenn beide verfügbar sind.
F # unterstützt die OCaml-Syntax direkt. Es ist vielleicht nicht 100% kompatibel, aber ich denke, es ist ziemlich nah.
http://plus.kaist.ac.kr/~shoh/fsharp/html/index.html
Hier ist eine Liste der Unterschiede (nicht sicher, wie aktuell es ist)
http://plus.kaist.ac.kr/~shoh/fsharp/html/fsharp-vs-ocaml.html