F # wechselt zu OCaml [geschlossen]

126

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.

Erik Forbes
quelle
3
Ein weiterer Vergleich aus der Sicht eines OCaml-Entwicklers, der ziemlich voreingenommen, aber dennoch nützlich ist.
Mauricio Scheffer
8
Achtung: Wenn Sie am Schicksal dieser Frage interessiert sind, nehmen Sie bitte an der Diskussion über Meta Stack Overflow teil oder diskutieren Sie sie im Chat - die Kommentare hier waren außerordentlich unproduktiv, daher habe ich sie entfernt.
Shog9
1
@MauricioScheffer Link gebrochen!
JD
2
@ JonHarrop Ich denke, dieser Link könnte der aktualisierte sein. (Von Keiko Nakata)
Bart

Antworten:

89

Die Hauptunterschiede sind, dass F # nicht unterstützt:

  • Funktoren
  • Objekte im OCaml-Stil
  • polymorphe Varianten
  • der Präprozessor oder die Erweiterungspunkte von camlp4 / 5 (ppx)

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).

Chris Conway
quelle
3
Gibt es ein camlp4-Äquivalent für F #?
Nlucaroni
Glaube nicht. Aber Sie könnten Ihr Programm wahrscheinlich über camlp4 in den F # -Compiler leiten. (Würde es nicht empfehlen.)
Chris Conway
6
F # hat benannte und optionale Argumente, verwendet jedoch eine andere Syntax und Semantik. Sie werden Probleme haben, Camlp4 mit F # zu verwenden, da F # fast immer einrückungsempfindlich ist und daher einen neuen Lexer benötigt und die Camlp4-Dokumentation zu Lexern seit fast zwei Jahren ungeschrieben ist.
JD
4
Und jetzt ist der Link tot. Ich nehme an, das ist wahrscheinlich gut. Ich bin sicher, dass F # seit '08 verbessert wurde.
1
Ich habe irgendwo gehört, dass Microsoft F # keine camlp4-ähnliche Funktionalität hinzufügen wollte, weil sie befürchteten, dass diese Funktionalität die Benutzer dazu ermutigen könnte, andere Entwicklungsumgebungen als Microsoft Visual Studio zu verwenden.
chrismamo1
118

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:

  • Maßeinheiten , mit denen Sie Code für numerische Berechnungen eingeben können
  • Metaprogrammierung mit Zitaten (was die Verwendung von LINQ in F # ermöglicht und auch für vielversprechende Projekte wie die WebSharper-Plattform unerlässlich ist)
  • Aktive Muster zum Erstellen von Abstraktionen für funktionale Datentypen (und im Allgemeinen sehr nützliche Funktion für kompliziertere Mustervergleichsanwendungen)
  • Berechnungsausdrücke , eine Sprachfunktion hinter asynchronen Workflows (eine Bibliothek für asynchrone E / A / Webdienst / GUI-Programmierung)
  • .NET-kompatibles Objektsystem , das eine vollständige Interaktion mit der .NET-Plattform ermöglicht (OCaml unterstützt auch Objekte, ist jedoch unterschiedlich - es gibt natürlich einige Vorteile in beiden Systemen).
  • Überladene Operatoren - Soweit ich weiß, hat OCaml keine überladenen Operatoren - in F # können Sie +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.

Tomas Petricek
quelle
18
Woah! OCaml wurde speziell für die Metaprogrammierung entwickelt und ist in diesem Zusammenhang F # und .NET weit überlegen. Camlp4 ist ein weitaus leistungsfähigeres Angebotssystem als F #. Die Lexer und Parser von OCaml sind weitaus besser als alles, was für .NET verfügbar ist. Außerdem sind Camlp4-Makros verfügbar, die aktive Muster und Berechnungsausdrücke implementieren. OCaml verfügt auch über IDEs, die dieselben Vorteile bieten wie Visual Studio für F #.
JD
4
F # -Zitate haben jedoch ein völlig anderes Ziel als das, was in Camlp4 verfügbar ist (abgesehen davon, dass dies keine OCaml-Sprache ist - es ist ein System darüber hinaus), daher ist es nicht fair, sie zu vergleichen. Die Existenz von Camlp4 ist sicherlich ein Vorteil von OCaml, hat aber nichts mit Zitaten zu tun (die Dinge wie WebSharper, das Ausführen von F # auf einer GPU usw. ermöglichen)
Tomas Petricek,
12
@Tomas: Wie können Sie Ihre Behauptung in Einklang bringen, dass Camlp4 "ein System über" OCaml "ist, wenn Camlp4 auf binärer Ebene in OCaml integriert ist und Camlp4-Makros im laufenden Betrieb in einem laufenden OCaml REPL definiert und verwendet werden können? Wie können Sie Ihre Behauptung, dass Camlp4 "nichts mit Zitaten zu tun hat", mit der Tatsache in Einklang bringen, dass Camlp4 einen Angebotsmechanismus bietet? Wie können Sie Ihre Implikation in Einklang bringen, dass Camlp4 Websharper nicht unterstützen kann, wenn das ocamljs-Tool von SkyDeck seit 2007 OCaml-Code kompiliert, der mit Camlp4 in Javascript zitiert wird?
JD
6
@Tomas: F # kann nicht einmal Ausdrücke mit ungebundenen Variablen wie zitieren <@ 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!
JD
8
@Erik: "Die meisten Leute konzentrieren sich auf das, was in F # fehlt, aber ich wollte auch sehen, was in OCaml fehlt." Beachten Sie, dass die aktiven Muster, Metaprogrammierungen, Berechnungsausdrücke und asynchronen Workflows in OCaml verfügbar waren, bevor sie in F # aufgenommen wurden.
JD
16

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.

JD
quelle
28
Für alle Links sind kostenpflichtige Abonnements erforderlich.
2
@Will sie scheinen ein schamloser Stecker für Dinge zu sein, die Jon Harrop selbst geschrieben hat (er wird jedes Mal als Autor aufgeführt)
Symbiont
@symbiont Ja, wir wissen, dass es ein bisschen spammig ist. Wäre schön, wenn Sie auf einige zusätzliche Informationen verlinken würden, die kostenlos waren. Aber die Antwort ist ohne die Links in Ordnung, also sind Sie da.
@ Will wäre schön, wenn Sie einige zusätzliche Informationen selbst verlinken würden
Symbiont
@symbiont Ich meinte Jon, nicht dich, als ich "du" sagte. Klingt komisch, es zu lesen. Ich bin mir nicht sicher, ob Jon einen Zwischenkommentar gelöscht hat. Wie auch immer, los geht's: Meta Stack Exchange
9

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.

James Woodyatt
quelle
2

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

Lou Franco
quelle
1
"F # unterstützt die OCaml-Syntax direkt. Es ist möglicherweise nicht 100% kompatibel, aber ich denke, es ist ziemlich nah". IME ist die Unterstützung des F # -Compilers für OCaml-Kompatibilität sehr fehlerhaft. Dies kann es schwierig machen, vorhandene OCaml-Codebasen auf F # zu portieren, da der F # -Compiler intern auf gültigem Code stirbt.
JD
Alle Links sind tot.
Wingjam