it-swarm.com.de

Gibt es Nachteile oder Probleme mit Haskell?

Ich möchte für mein nächstes (relativ triviales) persönliches Projekt nach Haskell eintauchen. Die Gründe, warum ich Haskell anpacke, sind:

  1. Bring meinen Kopf in eine rein funktionale Sprache
  2. Geschwindigkeit. Ich bin mir zwar sicher, dass dies argumentiert werden kann, aber ich habe Profile erstellt, in denen ich Nägel von Haskell in der Nähe von C++ gesehen habe (und die ziemlich viel schneller zu sein scheinen als Erlang).
  3. Geschwindigkeit. Der Warp-Webserver scheint im Vergleich zu praktisch allem anderen schnell verrückt zu sein .

Vor diesem Hintergrund suche ich nach den Nachteilen oder Problemen, die mit Haskell einhergehen. Das Web hat eine enorme Menge an Informationen darüber, warum Haskell eine gute Sache ist, aber ich habe nicht viele Themen über seine hässliche Seite gefunden (abgesehen von Griffen über seine Syntax, die mir überhaupt nicht wichtig sind).

Ein Beispiel für das, wonach ich suche, könnte Pythons GIL sein. Etwas, das seinen Kopf nicht aufrichtete, bis ich wirklich anfing, Parallelität in einer CPython-Umgebung zu verwenden.

47
Demian Brecht

Ein paar Nachteile, die mir einfallen:

  • Aufgrund der Natur der Sprache und ihrer festen Wurzeln in der akademischen Welt ist die Community sehr mathematisch eingestellt. Wenn Sie eine pragmatische Person sind, kann dies manchmal überwältigend sein, und wenn Sie den Jargon nicht sprechen, fällt es Ihnen schwerer als mit vielen anderen Sprachen.
  • Obwohl es eine unglaubliche Fülle an Bibliotheken gibt, ist die Dokumentation oft knapp.
  • Es gibt nur wenige und schwer zu findende Tutorials für Anfänger, daher ist die anfängliche Lernkurve ziemlich steil.
  • Einige Sprachfunktionen sind unnötig ungeschickt. Ein prominentes Beispiel ist, wie die Datensatzsyntax keinen Namensbereich einführt, sodass es nicht möglich ist, denselben Datensatzfeldnamen in zwei verschiedenen Typen innerhalb desselben Modul-Namespace zu verwenden.
  • Haskell verwendet standardmäßig eine faule Bewertung, und obwohl dies oft eine großartige Sache ist, kann es Sie manchmal auf böse Weise beißen. Eine naive Bewertung in nicht trivialen Situationen kann zu unnötigen Leistungsengpässen führen, und es ist nicht ganz einfach zu verstehen, was unter der Haube vor sich geht.
  • Eine verzögerte Auswertung (insbesondere in Kombination mit Reinheit und einem aggressiv optimierenden Compiler) bedeutet auch, dass Sie nicht einfach über die Ausführungsreihenfolge nachdenken können. Tatsächlich wissen Sie nicht einmal, ob ein bestimmter Code in einer bestimmten Situation tatsächlich ausgewertet wird. Folglich erfordert das Debuggen von Haskell-Code eine andere Denkweise, schon allein deshalb, weil das Durchgehen Ihres Codes weniger nützlich und weniger aussagekräftig ist.
  • Aufgrund der Reinheit von Haskell können Sie keine Nebenwirkungen verwenden, um Dinge wie E/A auszuführen. Sie müssen eine Monaden- und 'Missbrauchs'-Bewertung verwenden, um Interaktivität zu erreichen, und Sie müssen den monadischen Kontext an eine beliebige Stelle ziehen, an der Sie E/A ausführen möchten. (Dies ist in vielerlei Hinsicht eine gute Funktion, macht jedoch manchmal eine pragmatische Codierung unmöglich.)
48
tdammers

Die meisten Nachteile von Haskell (sowie die meisten Nachteile von Haskell) sind auf die beiden charakteristischen Merkmale zurückzuführen: Es ist faul und rein funktional.

Faul sein macht es schwieriger, über Leistung nachzudenken. Insbesondere für Menschen, die nicht an Faulheit gewöhnt sind, aber selbst für erfahrene Haskeller kann es schwierig sein zu erkennen, wie sich Faulheit in bestimmten Fällen auf die Leistung auswirkt.

Faulheit bedeutet auch, dass es schwieriger ist, genaue Benchmarks zu erstellen, ohne Bibliotheken wie Criterion zu verwenden.

Rein funktional zu sein bedeutet, dass Sie immer dann, wenn Sie veränderbare Datenstrukturen verwenden müssen (in Fällen, in denen es nicht möglich ist, die gewünschte Leistung ohne diese zu erzielen - obwohl dies dank des Optimierers von GHC nicht so oft vorkommt, wie Sie vielleicht denken) steckt in der Monade IO (oder ST)), was den Code umständlicher macht.

Da Sie Geschwindigkeit als eines Ihrer Ziele genannt haben, möchte ich darauf hinweisen, dass es häufig große Leistungsunterschiede zwischen handoptimiertem Haskell-Code und Haskell-Code gibt, der geschrieben wurde, ohne viel über die Leistung nachzudenken (mehr als in anderen Sprachen). Und handoptimierter Haskell-Code ist oft ziemlich hässlich (obwohl dies vermutlich auch in den meisten anderen Sprachen der Fall ist).

19
sepp2k

Ich bin kein Haskell-Experte: Ich habe die Grundlagen gelernt, aber leider hatte ich keine Gelegenheit, ein ernstes Projekt in Haskell durchzuführen (ich würde es jedoch gerne tun, weil ich diese Sprache sehr mag).

Nach meinem Wissen und aus einer Diskussion mit jemandem, der in einem Bereich gearbeitet hat, der der funktionalen Programmierung sehr nahe kommt, ist Haskell möglicherweise nicht die beste Lösung, wenn Sie Diagrammalgorithmen implementieren möchten, bei denen Sie z. um durch das Diagramm zu gehen und viele lokale Änderungen an der Diagrammstruktur vorzunehmen.

Da ein Diagramm im Allgemeinen keine rekursive Struktur aufweist, ist es meines Erachtens der beste Ansatz, eine Kopie des Diagramms mithilfe von Strukturen und Zeigern zwischen ihnen zu erstellen (wie Sie dies z. B. in C++ tun können) und diese Kopie durch Ändern der Zeiger zu bearbeiten. Erstellen oder Zerstören von Knoten und so weiter.

Ich frage mich, wie solche Datenstrukturen und Operationen in Haskell richtig gehandhabt werden können, da es meines Wissens in Haskell nicht möglich ist, die obige Darstellung/den obigen Ansatz zu verwenden. Einige Probleme mit Graph-Algorithmen in Haskell werden in dieser Artikel kurz erläutert

[~ # ~] edit [~ # ~]

Ich habe kürzlich mit einem Experten für funktionale Programmierung gesprochen und er hat bestätigt, dass die effiziente Implementierung bestimmter Graph-Algorithmen in Haskell ziemlich schwierig sein kann: Das Bewegen von Zeigern wie in C oder C++ kann viel schneller sein.

12
Giorgio

Der Nachteil von Haskell ist, dass es anders ist. Es ist ein größerer Schritt weg von Sprachen, die häufiger gelehrt oder besprochen werden, so dass es eine größere Lernkurve geben wird. Es ist auch weniger beliebt in einer Sprache, die die Verfügbarkeit von Hilfe einschränken kann, wenn Sie nicht weiterkommen. Dies sind jedoch keine großen Nachteile.

Ein möglicher Nachteil ist, dass es sich um eine funktionale Sprache handelt, die für bestimmte Problembereiche weniger nützlich ist. Dies gilt jedoch auch für objektorientierte Sprachen. Im Allgemeinen haben Sprachen keine echten Negative über Lernkurven hinaus, zumindest für die relativ populären Sprachen. Solange eine Sprache Turing vollständig ist, ist sie theoretisch zu allem fähig.

4
Ryathal

Vor diesem Hintergrund suche ich nach den Nachteilen oder Problemen, die mit Haskell einhergehen

Die "Probleme mit Haskell" treten in bestimmten Bereichen auf. Haskell ist eine wunderbare Sprache für die Programmierung von Anwendungen, die viel angenehmer zu schreiben ist als alles andere. Die Probleme treten häufig auf, wenn Sie versuchen, etwas zu tun, für das es keine gute Unterstützung gibt, wie z.

  • Cross-Kompilierung. GHC kann als Cross-Compiler erstellt werden, der Prozess ist jedoch ziemlich kompliziert.
  • Eingebettete Anwendungen. Haskell verfügt über eine Speicherverwaltung über einen Garbage Collector, daher ist dieser nicht allzu überraschend.
  • Geschwindigkeit. Haskell ist nicht so schnell wie Rust, obwohl es in den meisten Fällen ziemlich gut mithalten kann. Es hängt stark von der Anwendungsdomäne ab - reine Berechnungen werden gut optimiert, aber so etwas wie "Eine Datei in einen Puffer lesen und die Anzahl der Zeilen zählen" ist in Haskell schwieriger auszudrücken.
0
user275647