
Ich habe einmal mit dem Gründer eines israelischen Startups gesprochen, das eine Hochgeschwindigkeits-GPU-Datenbank entwickelt. Haskell und C ++ waren auf ihrem Stapel und der Gründer beschwerte sich darüber, wie schwierig es sei, Leute im Team zu finden. Er flog nach Moskau, auch um gute Programmierer zu suchen.
Ich fragte sorgfältig, ob es besser sei, etwas allgemeineres und neues zu verwenden. Und obwohl die Antwort höflich und konstruktiv war, schien es mir zwischen den Zeilen: "Pff, erwähne diese Spielzeug-Yapes nicht einmal."
Alles, was ich seitdem von der Seite über Haskell gehört habe, war auf eines zurückzuführen: "Witze sind schlecht mit ihm." Um die Haskellisten besser kennenzulernen, kam ich zum Telegramm-Chat, um ihnen Fragen zu stellen. Es war ziemlich beängstigend und wie sich herausstellte, nicht umsonst.
Sie wollen nicht im Volksmund über Haskell sprechen, und es scheint, dass sie solche Unternehmungen mit Verachtung betrachten. Schon gesprochen - mit maximaler Vollständigkeit und Objektivität. „Eine der charakteristischen Eigenschaften von Haskell als Sprache und Gemeinschaft ist, dass sie gemeinsam nicht danach strebten, populär zu werden, und eine einfache Antwort auf populäre Fragen gaben. Stattdessen haben sie einen logischen, prinzipiellen Weg gefunden, um echte Probleme zu lösen, anstatt schnell in das Herz eines Passanten einer interessierten Person einzudringen “, schrieben sie mir dort.
Einige Personen teilten jedoch ihre Erfahrungen mit, und ich sammelte hier ihre Meinungen.
Denis Mirzoev ( nolane ) : An der Universität wurde mir zum Thema "Programmiersprachen" angeboten, einen Kurs bei Haskell Coursera für einen weiteren von hundert Punkten zu
belegen . Dann gab es einen funktionalen Programmierkurs, bei dem Haskell stattfand. Er schrieb eine Hausarbeit und eine Abschlussarbeit des Bachelor über GHC. Ich habe einen Job als Haskell-Programmierer gefunden.
Es war schwer und immer noch schwer. Wenn Sie anfangen, Haskell zu studieren, müssen Sie viele neue Konzepte verstehen. Das ist harte Arbeit. Sie lernen buchstäblich wieder zu programmieren.
Für viele wird es jetzt schwierig sein, sich daran zu erinnern, wie sie ihre Reise in die Programmierung begonnen haben, wie schwierig es war zu verstehen, was ein „Zeiger“ war, was eine „Funktion“, was eine „Klasse“ ist. Vielleicht ist es deshalb so schwer, Haskell zu studieren. Mit zunehmendem Alter wird es schwieriger, neue Dinge zu lernen.
Doctor_Ryner : Einmal in einer Probezeit bin ich in Redux gefallen. Als ich mir die Lektionen seines Schöpfers
ansah , beschloss ich, alle besser kennenzulernen. Zuerst habe ich die erlernten Praktiken in JavaScript angewendet, dann aber Haskell kennengelernt, das als echte funktionale Sprache gilt. Ich war sofort von seiner Eleganz und einer Reihe neuer Konzepte angezogen, die mir unbekannt waren.
Es war nicht einfach mit endlosen Tutorials über Monaden am Beispiel von Burritos, die sehr verwirrend sind. Ein zwingender Hintergrund macht es auch schwierig, neue Konzepte zu eröffnen.
Yuri Syrovetsky ( cblp ) : Am schwierigsten zu lernen ist Haskell als Zweiter, als das Entlein-Syndrom nicht in die erste Sprache
überging .
Was ist gut und was ist schlechte Sprache?
Doctor_Ryner : Die Sprache ist sehr prägnant, elegant und flexibel, nicht umsonst ist die Hälfte der Bibliotheken EDSL (zumindest dieser Eindruck).
Yuri Syrovetsky ( cblp ) : Hohe Ausdruckskraft, einfache Übertragung des Themenbereichs auf Code, die optimale Kombination von imperativen und funktionalen Paradigmen. Es ist einfach, Abstraktionen auf Daten und Algorithmen zu erstellen, sodass Sie über das Problem nachdenken können, ohne von kleinen Dingen abgelenkt zu werden.
John Doe : Streng starkes (ich würde sagen faschistisches) Tippen.
Igor Shevnin ( interphx ) : Ein sehr ausdrucksstarkes
Typensystem . Nicht so mächtig wie Idris oder Agda, aber es erreicht diesen Mittelweg, wenn fast alles ausgedrückt werden kann und die Typinferenz gut funktioniert. Sie müssen sie nicht überall manuell markieren.
Bei einem leistungsstarken Typsystem müssen Sie jedoch auf die übergebenen Werte achten. Eine Reihe von Typdefinitionen könnte wie ein Boilerplate aussehen. Jedes Team verwendet seine eigenen Erweiterungen oder verwendet sie überhaupt nicht. Der Code ist "dichter" - eine Zeile enthält häufig mehr Informationen als in anderen Sprachen, sodass es für einen unerfahrenen Entwickler schwieriger ist, sie zu lesen.
Doctor_Ryner : Wenn Sie Haskell studieren, werden Sie höchstwahrscheinlich auf das Sprichwort stoßen: "Wenn es kompiliert, ist es wahrscheinlich richtig." Es gibt keine Null, das Funktionsparadigma selbst ist sehr streng und zwingt Sie, bestimmte Regeln zu befolgen, die in den meisten Fällen zu einem besseren Design führen.
Zum Beispiel gibt es keine Variablen in der Sprache - nur Konstanten. Sie müssen nicht verfolgen, was und wo Sie zuweisen. Haskell empfiehlt die Verwendung reiner Funktionen, was zu keinen Nebenwirkungen führt. Das funktionale Design lässt das Programm einfach als Ganzes funktionieren, im Gegensatz zu OOP, wo eine Reihe von Objekten in die Welt geworfen werden und Objekte versuchen, durch Nebenwirkungen miteinander zu kommunizieren, was die Anwendung in ein unvorhersehbares Chaos verwandelt. Bei der Arbeit leiden wir mit C # in Unity genug darunter.
Denis Mirzoev : Eingebaute Faulheit erhöht die Ausdruckskraft der Sprache. Viele Algorithmen werden einfacher. Es kann die Produktivität steigern, wenn die Ergebnisse von Zwischenberechnungen nicht verwendet werden. (Zum Beispiel arbeitet `head. Sort` in linearer Zeit).
Igor Shevnin : Ein faules Rechenmodell hilft normalerweise, aber wenn die Reihenfolge der aufrufenden Funktionen wichtig ist, kann es schwierig sein, herauszufinden, was passiert.
Doctor_Ryner : Es wird kompiliert, was die Geschwindigkeit sofort enorm erhöht.
Denis Mirzoev : Im Vergleich zu Java in der Geschwindigkeit, aber nicht so schnell wie C.
Igor Shevnin :
Standardmäßig werden Erweiterungen unterstützt, mit denen Sie das Sprach- und
Typensystem fertigstellen können. Es gibt jedoch viele weit verbreitete Erweiterungen, die der Community vertraut sind, anständige Beispiele und Dokumentationen enthalten und keine Nische darstellen.
Doctor_Ryner : Die Prelude-Standardbibliothek hat sehr schlechte Funktionen wie read, head, readFile, die eine Ausnahme auslösen und in ein Programm einfügen können, anstatt Vielleicht zurückzugeben. Daher müssen Sie Alternativen verwenden oder Ihre eigenen Implementierungen schreiben.
Igor Shevnin : Das Hauptproblem ist die mangelnde Standardisierung, da viele die Standardbibliothek durch eine der inkompatiblen Alternativen ersetzen. In der Community gibt es Meinungsverschiedenheiten darüber, was eine Standardbibliothek sein sollte, was im Kern der Sprache enthalten sein sollte und was durch Erweiterungen ergänzt werden sollte, und ich bin der Meinung, dass dies die Entwicklung der Sprache verlangsamt.
Denis Mirzoev : Es gibt nicht genügend Tools: Es gibt keine vollwertige IDE, es gibt nur sehr wenige Tools zum Messen der Leistung, es gibt kein "schrittweises" Debuggen - dies ist im Allgemeinen ein grundlegendes Problem.
Für welche Projekte ist Haskell am besten geeignet?
Yuri Syrovetsky : Für komplexe Aufgaben im Zusammenhang mit Sicherheit oder Geld, bei denen die Fehlerkosten hoch sind.
Doctor_Ryner : Für alles, wo Sie Berechnungen, Transformationen und Datenanalysen durchführen müssen. Sehr überrascht, dass Haskell in Data Science weniger beliebt ist als Python.
Igor Shevnin : Ich würde nicht riskieren, es für eingebettete Systeme zu verwenden (die Leistung ist nicht schlecht, aber es gibt immer noch einen erheblichen Overhead für den Speicherverbrauch aufgrund fauler Berechnungen) und kleine Skripte (diese Genauigkeit wird dort einfach nicht benötigt). Sie müssen auch verstehen, dass es viel schwieriger ist, Entwickler in einem Team zu finden als für Mainstream-Sprachen.
John Doe : Um Branchencode zu schreiben, den andere lesen werden, benötigen Sie ein ganzes Team von Haskellisten. So wenige Menschen haben es geschafft zu sammeln.
Igor Shevnin : Aufgrund seiner Kürze und Genauigkeit ist Haskell für fast jede Aufgabe geeignet.
Es ist eine gute Idee, mit Haskell die Entwicklung zu lernen?
Igor Shevnin: Es ist unwahrscheinlich, dass es anfängt, da die überwiegende Mehrheit der Codebasen, mit denen eine Person arbeiten muss, nicht darauf geschrieben ist.
John Doe : Schlechte, schlechte Idee! Sprachen, die nicht aus der ML-Familie stammen, sondern aus den Industriesprachen im Allgemeinen, werden Sie dann schockieren.
Denis Mirzoev : Normalerweise studieren die Leute zuerst Mathematik und dann Programmieren. Daher sollte das Erlernen einer Sprache mit mathematischen Konzepten (algebraische Datentypen, reine Funktionen) einfacher als zwingend sein. Das heißt, ich denke, das ist eine gute Idee.
Doctor_Ryner : Alle Neuankömmlinge, die ich trainiere, werde ich Ihnen auf jeden Fall Haskell vorstellen. Menschen, die den imperativen Stil nicht studiert haben, sind viel einfacher im Funktionscode zu navigieren und lernen schneller. Selbst wenn sie mit objektorientierten Sprachen arbeiten, bringen sie gute architektonische Lösungen und funktionale Praktiken mit.
Yuri Syrovetsky : Es ist besser, sofort mit mehreren grundlegend unterschiedlichen Sprachen zu beginnen, zum Beispiel C, Haskell und Smalltok, in beliebiger Reihenfolge. Keine einzige Sprache in
separat wird kein vollständiges Verständnis geben.
Haskell ist eine ziemlich alte Sprache. Ist das gut oder schlecht?
Yuri Syrovetsky: Die Sprache entwickelt sich sehr aktiv, die Last der Kompatibilität nur aus Gründen der Kompatibilität zieht nicht.
John Doe : Der Standard wurde 1998 übernommen, aber das fällt nicht auf: Bis jetzt werden ungefähr alle sechs Monate neue Versionen des Compilers veröffentlicht, die möglicherweise die Abwärtskompatibilität beeinträchtigen.
Denis Mirzoev : Haskell ist nicht alt, aber erprobt. Gedankenlose Änderungen werden niemals in die Sprache gelangen. Es ist also ziemlich gut.
Haskell gilt als eine der komplexesten Sprachen. Ist das so?
Doctor_Ryner : Wie die Sprache selbst, nein. Wahrscheinlicher sind die darin verwendeten Abstraktionen. Eine Person, die noch nie Haskell-Code gesehen hat, kann mit dem Fluss neuer Informationen und verschiedenen ungewöhnlichen Konstruktionen einfach verrückt werden.
Öl trägt zum Feuer bei, dass die Sprache eine Reihe von "Einschränkungen" auferlegt, eine Reihe von Dingen, die nicht in ein Funktionskonzept passen, nicht zulässt oder stark erschwert.
John Doe : Bis das erste Grundprojekt mindestens zusammengestellt war, dauerte es fast zwei Monate, um abends Lehrbücher, Handbücher und Tutorials zu rauchen. Richtig, nach dem Kompilieren begann das Projekt sofort und arbeitete sechs Monate lang unter Volllast (6k U / min mit Spitzenwerten bis zu 15), ohne dass Änderungen vorgenommen wurden.
Denis Mirzoev : Ich wette, wenn ein Student anfängt, Programmieren bei Haskell zu studieren und sich weit genug bewegt, wird ihm die imperative Programmierung komplizierter und weniger intuitiv erscheinen.
Igor Shevnin : Die Komplexität ist relativ. Von den Mainstream-Sprachen finde ich C ++ immer noch die komplexeste. Sprachen zum Beweisen von Theoremen (Agda, Coq) werden im konzeptionellen Sinne komplizierter sein als Haskell. Haskell ist eine einfache Sprache, aber ihre Muster und Bibliotheken - Standard- und Drittanbieter-Sprachen - können bei weitem nicht sofort erlernt werden.
Ist seine Komplexität immer gerechtfertigt?
Igor Shevnin : Muster und ein hohes Maß an Abstraktion sind gerechtfertigt, da sie den Code zuverlässiger und kürzer machen. Aber ich denke, dass Operatoren, Funktionsnamen und viele andere Dinge klarer sein könnten.
Doctor_Ryner : Mit komplexen Haskell-Konstrukten können Sie häufig sehr kurze Lösungen erstellen, die sich auch als sehr flexibel und modular herausstellen.
Yuri Syrovetsky : Abgesehen davon, dass das Verwalten von Effekten umständlich ist, wenn auch fast
Es ist immer besser als mangelnde Kontrolle. Aber über die Vereinfachung
Die Arbeit ist im Gange.
John Doe : Die Sprache für diejenigen, die an reguläres Python / PHP / was auch immer gewöhnt sind, lässt es im Allgemeinen orthogonal zur Realität erscheinen. Für Menschen, die anfangs nicht an Kategorietheorie interessiert waren, ist es sehr schwierig, Ergebnisse vom absoluten Nullpunkt zu erzielen.
Wenn Sie jedoch die Sprache verstehen, erhalten Sie eine neue Möglichkeit, über das zu lösende Problem nachzudenken.
Haskell scheint eine Sprache für Mathematiker zu sein, nicht für Entwickler. Denken Sie, dass es deshalb nicht weit verbreitet ist?
Denis Mirzoev : Dies ist eine Demonstration des Prinzips, dem die Hauptentwickler von Haskell folgen: "Vermeiden Sie Erfolg um jeden Preis". Es geht natürlich nicht darum, Erfolg zu vermeiden, sondern um Erfolg, dessen Preis zu hoch ist.
Haskell könnte populär gemacht werden. Diese Sprache wird beispielsweise von Microsoft unterstützt. Es war möglich, die Sprache zwingender zu machen, einige schnelle und schlecht durchdachte Entscheidungen zu treffen, um an Popularität zu gewinnen. Es war möglich, viele schmutzige Tricks anzuwenden, aber dank der richtigen Position der Hauptentwickler gab es nichts Vergleichbares.
Ja, die Popularität der Sprache ist nicht sehr hoch, aber ihre Qualität leidet nicht. Die Vorteile von Haskell gegenüber imperativen Sprachen liegen für mich auf der Hand. Die meisten seiner Probleme sind lösbar. Ich bin mir daher sicher, dass die Entwicklung im Laufe der Zeit sehr beliebt sein wird.
Yuri Syrovetsky : Also wird er nur von Leuten gesehen, die nichts über ihn wissen. In
Haskell nutzt die "echte" Entwicklung seit langem, Beispiele sind leicht zu finden
Ihre Lieblingssuchmaschine. Insbesondere verwenden wir in LC
Haskell ist zufrieden und wir sehen nichts anderes an seiner Stelle.
Igor Shevnin : Was eine "Sprache für Mathematiker" ist, weiß ich wirklich nicht. Dies ist entweder R / MatLab / Mathematica für Berechnungen und Statistiken oder Python, da es einfach ist und weniger technischen Hintergrund erfordert. Aber nicht Haskell. Algebraische Konzepte wie Monoide werden darin aus praktischen Gründen und nicht nur für zusätzliche Genauigkeit verwendet.
Die Hauptrolle bei der Popularität spielte die historische Verbreitung von C / C ++ / Java / C # im Unternehmen, sie besetzten eine Nische. Aber jetzt beginnen viele Unternehmen, Haskell und andere funktionale Sprachen zu verwenden.
Mit welchem Yap würden Sie Haskell vergleichen und zu wessen Gunsten?
John Doe : Mehr oder weniger häufig - mit Erlang. Aber Erlang ist immer noch leichter zu schreiben und leichter zu lernen, scheint mir.
Denis Mirzoev : Ich kenne C, C ++, Java und Haskell gut. C ++ muss nicht einmal mit irgendetwas verglichen werden, die Sprache ist schrecklich. C ist eine gute Sprache für die Entwicklung auf niedriger Ebene. In dieser Nische wird er besser sein. Ansonsten würde ich Haskell vorziehen.
Die Wahl zwischen Java und Haskell ist bereits schwieriger, aber hier müssen Sie sich auch eine bestimmte Aufgabe ansehen. Für Android auf Haskell wird es höchstwahrscheinlich schwierig sein zu schreiben, in diesem Fall ist Java besser. Der in Haskell zu schreibende Server ist jedoch fast so praktisch wie in Java. Wenn die Umgebung dies zulässt - Optimierung, Zugänglichkeit von Bibliotheken -, wähle ich normalerweise Haskell.
Doctor_Ryner : Mit C # googeln Sie einfach, wie Sie Vielleicht in C # und in Haskell implementieren. Es ist sehr seltsam, dass sich der diktatorische rein funktionale Haskell viel flexibler und freier fühlt. In der Tat sind dies zwei Extreme.
C # ist eine der objektorientiertesten Sprachen, und die Vorteile von Haskell stehen in starkem Kontrast dazu. In C # muss man ständig eine Menge unnötiger Dinge schreiben, und das alles ist sehr unangenehm. Die Verwendung von Funktionen höherer Ordnung kann den Code in Bezug auf die Syntax verderben. Inmitten all dessen ist es bereits schwierig, von Haskells kurzen und eleganten Lösungen zurück zu kommen.
Igor Shevnin : Mit Rust bisher zugunsten von Rust. Es erfordert viel von Haskell und anderen FP-Sprachen, aber gleichzeitig ist der funktionale Ansatz mit dem Imperativ vereinbar, und die Entwickler und die Community sind von Anfang an viel kompetenter und konsequenter bei der Entwicklung der Sprache.
Was halten Sie von der Haskellistengemeinschaft?
John Doe : Die überwiegende Mehrheit sind sehr freundliche Menschen, die immer bereit sind zu helfen. Ein schöner Unterschied zu den Communities vieler anderer Sprachen.
Doctor_Ryner : In Haskell-Communities gibt es oft erschreckend kluge Leute, die immer bereit sind zu helfen. Nicht umsonst gehen lokale Memes über PhD, Kategorietheorie und Akademiker. Wenn Sie in anderen Sprachen in den Chat gehen, sehen Sie, dass die Leute über normale Produktionsprobleme und Datenstrukturen diskutieren. In einem Haskell-Chat tauchen sofort Monaden, Yonedas Lemma, anwendbare Funktoren, das Schreiben verrückter Typen usw. vor Ihnen auf.
Sie sehen sofort so viel Neues, dass Sie es vorher nicht wussten - verrückte Kompositionen, elegante Transformationen und Transformationen, Lösungen für Probleme, die Dutzende von Zeilen in den Mainstream-Sprachen einnehmen, fast in einer Zeile.
Sie sagen, die Haskellisten seien arrogant. Richtig?
Denis Mirzoev : Ja. Es scheint mir, dass Arroganz auf die Tatsache zurückzuführen ist, dass sie ihre Sprache wirklich lieben und sich über ihre Unterschätzung aufregen.
John Doe : Nifiga so.
Doctor_Ryner : Diese Meinung ist höchstwahrscheinlich verschwunden, da viele Mainstream-Entwickler sehr verärgert sind, wenn Haskelists über funktionale Programmierung und ihre Vorteile sprechen. Ein schreckliches Missverständnis kann wiederum den Haskelisten selbst ärgern, und er wird anfangen, sich in Begriffen zu beeilen, für die er von den FAQ stigmatisiert wird.
Igor Shevnin : Arroganz ist ein zu starkes Wort. Hier geht es vielmehr darum, dass FP, OOP, der Unterschied zwischen OOP-Klassen und Unionstypen, das Erweiterungsproblem und viele andere Konzepte einst ein sehr klares Bild ergeben und es danach schwierig wird, Menschen wahrzunehmen, die versuchen, sich OOP und FI zu widersetzen oder sich auf andere Weise vorzustellen weit verbreitetes Problem in einer engen Perspektive.
Warum sind FP-Sprachen immer noch eine Nische?
Denis Mirzoev : Ihre Vorteile reichen immer noch nicht aus, um eine große Anzahl von Programmierern zu interessieren. Lernschwierigkeiten begünstigen die Popularität nicht. Probleme mit dem Tuning schrecken auch viele ab, aber es scheint mir, dass nur eine Vergrößerung der Community dieses Problem lösen könnte. Es stellt sich ein Teufelskreis heraus.
Igor Shevnin : Die Nische
vergeht allmählich und funktionale Konzepte werden in andere Sprachen gezogen.
Doctor_Ryner : Die Funktionsprinzipien selbst und die Sprachen, die sie unterstützen, sind bereits allgegenwärtig. Selbst für Sharps gibt es Linq und einige andere Bibliotheken. Nischen sind eher rein funktionale Sprachen, da sie nicht standardmäßige Konzepte verwenden.
Vergessen Sie nicht, dass Eisen vor 20 Jahren für funktionale Sprachen nicht produktiv genug war, so dass der Funktionalismus in den letzten Jahren in den Mainstream eintrat und das Interesse an Haskell nur wächst.