Was sind die Hauptunterschiede zwischen Haskell und F #? [geschlossen]
135
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?
Das Schöne an F # ist, dass es aufgrund seines gemischten Paradigmas einen besseren Ausgangspunkt für den OO-Programmierer bietet. Er kann sich allmählich mit funktionalem Denken vertraut machen und trotzdem auf vertraute OO-Bibliotheken zurückgreifen, wie er es in C # getan hätte. Haskell zwingt Ihnen die gesamte funktionale Enchilada auf einmal auf.
Mario
Es ist wichtig zu beachten, dass F # keine funktionierende Programmiersprache ist. Es hat sich jedoch ziemlich stark von FP übernommen, so dass es möglich ist, vielleicht viele Ähnlichkeiten zu finden, aber dennoch würde ich in erster Linie sagen, dass es sich um völlig unterschiedliche Sprachen handelt.
MasterMastic
Antworten:
128
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.
Ein weiterer potenzieller Hauptvorteil von F # (abhängig von der Situation) ist, dass es nicht faul ist, was bedeutet, dass die Lernkurve für das Denken über Raum-Zeit-Verhalten für praktisch jeden viel einfacher ist.
Ein weiteres erwähnenswertes Merkmal ist, dass der Compiler, eine Sprache, die reine Programmierung erzwingt, viel mehr Freiheit für viele Optimierungen hat. Sprachen wie F #, die die Reinheit fördern, aber dennoch ermöglichen, dass ungeprüfte unreine Operationen in einem Codeblock abgelegt werden, verlieren einige potenzielle Optimierungen, da der Compiler davon ausgehen muss, dass jeder Aufruf die erforderlichen Nebenwirkungen enthält.
Ben
12
@ JonHarrop: Das ist eine Aussage über Algorithmen, die nichts mit der Anwendbarkeit von Compiler-Optimierungen zu tun hat. Mit erzwungenen Reinheitssprachen können Sie im Allgemeinen explizit unreinen Code schreiben, wenn Sie dies wirklich benötigen (wenn nichts anderes, verwenden Sie einen FFI, um C aufzurufen). Der Compiler kann Code-Transformationen freier anwenden, wenn die Reihenfolge der (unbekannten) Nebenwirkungen nicht beibehalten werden soll. In Sprachen mit "ermutigter Reinheit" schreiben Sie größtenteils ähnlichen Code, sodass dieselben Optimierungen anwendbar sind, nur dass sie möglicherweise Nebenwirkungen ungültig machen (die nicht vorhanden sind, aber der Compiler kann dies nicht annehmen).
Ben
3
@ JonHarrop Wann habe ich behauptet, dass es sich um Algorithmen handelt? In jedem Fall vergleichen wir Haskell und F #, nicht Haskell und C. F # ist eine Sprache mit "ermutigter Reinheit", daher schreiben Sie häufig reinen Code. Ich behaupte nur, dass genau derselbe Code vom Compiler in einer Einstellung "erzwungene Reinheit" oft besser optimiert werden kann, da der F # -Compiler davon ausgehen muss, dass Aufrufe Nebenwirkungen haben. Sie sprechen über das Umschreiben des Codes, um einen anderen Algorithmus zu verwenden (einer, der von den Nebenwirkungen abhängt). Ich gehe auf die "Optimierbarkeit" von reinem Code in F # gegen Haskell ein.
Ben
53
Große Unterschiede:
Plattform
Objektorientierung
Faulheit
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:
Syntax: Haskell hat meiner Meinung nach eine etwas schönere Syntax. Es ist etwas knapper und regelmäßiger, und ich mag es, Typen in einer separaten Zeile zu deklarieren. YMMV.
Tools: F # verfügt über eine hervorragende Visual Studio-Integration, wenn Sie so etwas mögen. Haskell hat auch ein älteres Visual Studio-Plugin , aber ich glaube nicht, dass es jemals aus der Beta herausgekommen ist. Haskell hat einen einfachen Emacs-Modus, und Sie können wahrscheinlich OCamls Tuareg-Modus verwenden , um F # zu bearbeiten.
Nebenwirkungen: Beide Sprachen machen es ziemlich offensichtlich, wenn Sie Variablen mutieren. Der Compiler von Haskell zwingt Sie jedoch auch dazu, Nebenwirkungen zu markieren, wenn Sie sie verwenden. Der praktische Unterschied besteht darin, dass Sie sich viel mehr bewusst sein müssen, wenn Sie Bibliotheken mit Nebenwirkungen verwenden.
Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. - Von Review
mirabilos
33
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.
F # hatte bereits mehrere wichtige Erfolgsgeschichten (Halo 3, AdCenter, F # für Visualisierung), die das, was Haskell einer Erfolgsgeschichte am nächsten kommt, in den Schatten stellen (Darcs).
JD
Es lohnt sich darauf hinzuweisen, dass dies natürlich Nachteile hat. (CLR-Einschränkungen)
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 dieAnotherThingTrue()
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
quelle
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:
quelle
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 .
quelle
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.)
quelle
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.
quelle