Ich habe im Internet nach Vergleichen zwischen F # und Haskell gesucht, aber nichts wirklich Bestimmtes gefunden. Was sind die Hauptunterschiede und warum sollte ich einen über den anderen wählen wollen?
Antworten:
Haskell ist eine "reine" funktionale Sprache, in der F # sowohl Aspekte der imperativen / OO- als auch der funktionalen Sprache enthält. Haskell hat auch eine faule Bewertung, was unter funktionalen Sprachen ziemlich selten ist.
Was bedeuten diese Dinge? Eine reine Funktionssprache bedeutet, dass es keine Nebenwirkungen gibt (oder Änderungen im gemeinsamen Status, wenn eine Funktion aufgerufen wird), was bedeutet, dass Sie garantiert sind, dass beim Aufrufen von f (x) nichts anderes passiert, als einen Wert von der Funktion zurückzugeben. B. Konsolenausgabe, Datenbankausgabe, Änderungen an globalen oder statischen Variablen. Obwohl Haskell nicht reine Funktionen (durch Monaden) haben kann, muss dies durch Deklaration "explizit" impliziert werden.
Reine funktionale Sprachen und die Programmierung ohne Nebenwirkungen haben in letzter Zeit an Popularität gewonnen, da sie sich gut für die Mehrkern-Parallelität eignet, da es viel schwieriger ist, ohne gemeinsamen Status falsch zu liegen, als mit unzähligen Sperren und Semaphoren.
Bei der verzögerten Auswertung wird eine Funktion NICHT ausgewertet, bis sie unbedingt erforderlich ist. Dies bedeutet, dass viele Operationen vermieden werden können, wenn sie nicht erforderlich sind. Stellen Sie sich dies in einer einfachen C # if-Klausel wie der folgenden vor:
if(IsSomethingTrue() && AnotherThingTrue())
{
do something;
}
Wenn IsSomethingTrue()
false, wird die AnotherThingTrue()
Methode niemals ausgewertet.
Während Haskell eine erstaunliche Sprache ist, besteht der Hauptvorteil von F # (vorerst) darin, dass es oben auf der CLR sitzt. Dies eignet sich für die polyglotte Programmierung. Eines Tages können Sie Ihre Web-Benutzeroberfläche in ASP.net MVC, Ihre Geschäftslogik in C #, Ihre Kernalgorithmen in F # und Ihre Komponententests in Ironruby schreiben. Alles im .NET-Framework.
Hören Sie mit Simon Peyton Jones im Radio Software Engineering, um weitere Informationen zu Haskell zu erhalten: Episode 108: Simon Peyton Jones zu Functional Programming und Haskell
Große Unterschiede:
Die Ähnlichkeiten sind wichtiger als die Unterschiede. Grundsätzlich sollten Sie F # verwenden, wenn Sie bereits in .NET sind, andernfalls Haskell. Außerdem bedeuten OO und Faulheit, dass F # näher an dem liegt, was Sie (wahrscheinlich) bereits wissen, sodass es wahrscheinlich einfacher zu lernen ist.
Plattform: Haskell hat eine eigene Laufzeit, F # verwendet .NET. Ich weiß nicht, was der Leistungsunterschied ist, obwohl ich vermute, dass der durchschnittliche Code vor der Optimierung ungefähr gleich ist. F # hat den Vorteil, wenn Sie die .NET-Bibliotheken benötigen.
Objektorientierung: F # hat OO und achtet sehr darauf, dass .NET-Klassen einfach zu verwenden sind, auch wenn Ihr Code nicht OO ist. Haskell hat Typklassen, mit denen Sie auf seltsame Weise so etwas wie OO machen können. Sie sind wie Ruby-Mixins, die mit generischen Common Lisp-Funktionen gekreuzt sind. Sie sind ein bisschen wie Java / C # -Schnittstellen.
Faulheit: Haskell ist faul, F # nicht. Faulheit ermöglicht einige nette Tricks und lässt einige Dinge, die langsam aussehen, tatsächlich schnell ausgeführt werden. Es fällt mir jedoch viel schwerer zu erraten, wie schnell mein Code ausgeführt wird. In beiden Sprachen können Sie das andere Modell verwenden. Sie müssen es nur in Ihrem Code explizit angeben.
Kleinere Unterschiede:
F # gehört zur ML-Sprachfamilie und steht OCaml sehr nahe. Vielleicht möchten Sie diese Diskussion über die Unterschiede zwischen Haskell und OCaml lesen .
Ein Hauptunterschied, der wahrscheinlich auf die Reinheit zurückzuführen ist, aber ich sehe weniger erwähnt, ist die allgegenwärtige Verwendung von Monaden. Wie häufig erwähnt, können Monaden in fast jeder Sprache erstellt werden, aber das Leben ändert sich stark, wenn sie in allen Bibliotheken verwendet werden und Sie sie selbst verwenden.
Monaden bieten etwas, das in anderen Sprachen viel eingeschränkter zu sehen ist: die Abstraktion der Flusskontrolle. Sie sind unglaublich nützliche und elegante Methoden, um alle möglichen Dinge zu tun, und ein Jahr Haskell hat die Art und Weise, wie ich programmiere, völlig verändert, genauso wie der Wechsel von der imperativen zur OO-Programmierung vor vielen Jahren sie geändert hat, oder viel später. mit Funktionen höherer Ordnung tat.
Leider gibt es in einem solchen Raum keine Möglichkeit, genügend Verständnis zu vermitteln, um den Unterschied zu erkennen. In der Tat wird keine Menge an Schreiben es tun; Sie müssen einfach genug Zeit damit verbringen, Code zu lernen und zu schreiben, um ein echtes Verständnis zu erlangen.
Außerdem kann F # manchmal etwas weniger funktional oder umständlicher sein (aus Sicht der funktionalen Programmierung), wenn Sie mit der .NET-Plattform / -Bibliotheken kommunizieren, da die Bibliotheken offensichtlich aus OO-Sicht entworfen wurden.
Sie können Ihre Entscheidung also folgendermaßen betrachten: Möchten Sie eine dieser Sprachen ausprobieren, um eine schnelle, relativ kleine Verbesserung zu erzielen, oder sind Sie bereit, mehr Zeit zu investieren und weniger unmittelbaren Nutzen für etwas Größeres zu erzielen langfristig. (Oder zumindest, wenn Sie nichts Größeres bekommen, die einfache Möglichkeit, schnell zum anderen zu wechseln?) Wenn das erstere F # Ihre Wahl ist, wenn das letztere Haskell.
Ein paar andere Punkte, die nichts miteinander zu tun haben:
Haskell hat eine etwas schönere Syntax, was keine Überraschung ist, da die Designer von Haskell ML recht gut kannten. Die "leichte" Syntax von F # trägt jedoch wesentlich zur Verbesserung der ML-Syntax bei, sodass dort keine große Lücke besteht.
In Bezug auf Plattformen ist F # natürlich .NET; Wie gut das auf Mono funktioniert, weiß ich nicht. GHC kompiliert zu Maschinencode mit einer eigenen Laufzeit und funktioniert sowohl unter Windows als auch unter Unix gut. Dies ist im Vergleich zu .NET genauso wie beispielsweise in C ++. Dies kann unter bestimmten Umständen von Vorteil sein, insbesondere im Hinblick auf die Geschwindigkeit und den Maschinenzugriff auf niedrigerer Ebene. (Ich hatte zum Beispiel kein Problem damit, einen DDE-Server in Haskell / GHC zu schreiben. Ich glaube nicht, dass Sie das in einer .NET-Sprache tun können, und trotzdem möchte MS nicht, dass Sie das tun.)
Zum einen würde ich sagen, dass ein Hauptvorteil darin besteht, dass F # gegen die .NET-Plattform kompiliert wird, was die Bereitstellung unter Windows vereinfacht. Ich habe Beispiele gesehen, die die Verwendung von F # in Kombination mit ASP.NET zum Erstellen von Webanwendungen erklärt haben ;-)
Auf der anderen Seite gibt es Haskell schon länger, daher denke ich, dass die Gruppe der Leute, die echte Experten für diese Sprache sind, viel größer ist.
Für F # habe ich bisher nur eine echte Implementierung gesehen, nämlich das Singularity Proof of Concept OS. Ich habe mehr reale Implementierungen von Haskell gesehen.