Ist Haskell wirklich die Sprache der Genies und der Wissenschaft?



Ich hatte einmal eine Diskussion mit einem Gründer eines israelischen Startups, der eine GPU-basierte Datenbank mit Schwerpunkt auf Geschwindigkeit entwickelte. Der Arbeitsstapel umfasste unter anderem Haskell und C ++, und der Gründer beschwerte sich darüber, wie schwierig es ist, kompetente Programmierer zu finden. Das war einer der Gründe, warum er nach Moskau kam.

Ich fragte sorgfältig, ob sie erwägen, etwas Populäreres und Neues zu verwenden. Und obwohl die Antwort eher höflich und mit Argumenten untermauert war, klang sie immer noch wie „Komm schon, bring nicht einmal diese Spielsachen zur Sprache“.

Bis dahin konnte alles, was ich über Haskell hörte, als „SEHR vorsichtig im Umgang damit“ zusammengefasst werden. Um die Haskell-Programmierer besser kennenzulernen, kam ich zu einem aktuellen Telegramm-Chat mit einigen Fragen. Anfangs hatte ich große Angst, und wie sich herausstellte, hatte ich recht.

Haskell eignet sich nicht für populäre Erklärungen, und die Leute versuchen es anscheinend nicht einmal. Wenn das Thema jemals angesprochen wird, wird es nur ausführlich und so objektiv wie möglich besprochen. Jemand schrieb mir: „Eines der bestimmenden Merkmale von Haskell selbst und seiner Community ist, dass sie nicht versucht haben, irgendeine Art von Mainstream-Anerkennung zu erreichen. Stattdessen konzentrierten sie sich darauf, einen logischen, prinzipiellen Weg zur Lösung realer Probleme zu finden, indem versucht wurde, ein möglichst breites Publikum zu beschwichtigen. “

Trotzdem haben mir einige Leute von ihren Erfahrungen erzählt, die unten gezeigt werden.

Denis Mirzoev ( Nolane ) : Als ich auf dem College war, haben sie mir angeboten, einen Coursera-Kurs auf Haskell zu machen, um zusätzliche Credits zu erhalten. Dann hatten wir auch einen funktionalen Programmierkurs, der Haskell beinhaltete. Ich habe eine meiner Hausarbeiten sowie die Abschlussarbeit über GHC geschrieben. Dann fand ich einen Job als Haskell-Programmierer.

Es war und ist schwer. Wenn Sie anfangen, Haskell zu lernen, müssen Sie viele neue Konzepte in Ihren Kopf stecken. Es ist, als würde man wieder von Grund auf lernen, Code zu schreiben.

Menschen neigen dazu, ihre früheren Erinnerungen zu vergessen (oder zu glätten): wie wenn sie Schwierigkeiten hatten zu verstehen, was ein „Zeiger“, eine „Funktion“ oder eine „Klasse“ ist. Vielleicht fällt es ihnen deshalb so schwer, Haskell zu lernen: Mit zunehmendem Alter wird es schwieriger, neue Dinge zu lernen.

Doctor_Ryner : Nachdem ich meine Probezeit bei einem Job wegen eines Redux-Fuckups nicht bestanden hatte, habe ich versucht, mich ein bisschen besser damit vertraut zu machen, indem ich mir Videos von seinem Schöpfer angesehen habe. Zuerst habe ich in JavaScript geübt, dann habe ich etwas über Haskell gelernt, das als die „wahre“ funktionale Sprache gilt. Ich war fasziniert von seinen einzigartigen Konzepten und wie ordentlich es war.

Tutorials sind jedoch nicht allzu benutzerfreundlich, und ihr zwingender Hintergrund verhindert, dass neue Konzepte entstehen.

Yuri Syrovetskiy ( cblp ) : Das Schwierigste ist, Haskell als Ihre zweite Sprache zu lernen, wenn die Erinnerungen an das Erlernen der ersten noch frisch sind.

Was ist gut und schlecht an Haskell?


Doctor_Ryner : Es ist prägnant, elegant und flexibel. Kein Wunder, dass die Hälfte der Bibliotheken auf EDSL ist (oder zumindest so fühlt es sich an).

Yuri Syrovetskiy : Es ist (subjektiv) einfach, Ihre Gedanken an Code anzupassen. Es besteht ein ausgewogenes Verhältnis zwischen imperativen und funktionalen Paradigmen. Das Erstellen von Abstraktionen von Daten und Algorithmen ist recht einfach, sodass Sie über die jeweilige Aufgabe nachdenken können, ohne sich von kleinen Ärgernissen ablenken zu lassen.

John Doe : Strenge, starke (sogar faschistische, würde ich sagen) Typisierung.

Igor Shevnin ( interphx ) : Ein großartiges Typensystem . Es ist nicht so mächtig wie in Idris oder Agda, erreicht aber dennoch den bequemen Mittelpunkt, an dem Sie fast alles beschreiben können, und dennoch funktioniert die Typinferenz gut. Sie müssen sie nicht jedes Mal manuell markieren.

Ein leistungsstarkes Typsystem zwingt Sie jedoch dazu, den übertragenen Werten mehr Aufmerksamkeit zu schenken. Eine Reihe von Typdefinitionen könnte wie ein Boilerplate aussehen. Jeder Befehl hat einen eigenen oder gar keinen Erweiterungssatz. Der Code ist „dichter“ - jede Zeichenfolge 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 lernen, werden Sie wahrscheinlich auf dieses Sprichwort stoßen : "Wenn es kompiliert wird, ist es wahrscheinlich richtig." Null existiert nicht, das Funktionsparadigma selbst ist sehr streng und hält Sie innerhalb bestimmter Richtlinien, die in den meisten Fällen zu einem besseren Design führen.

Zum Beispiel hat Haskell keine Variablen - nur Konstanten. Sie müssen nicht verfolgen, was wo zugewiesen ist. Haskell bietet Anreize für die Verwendung von „reinen“ Funktionen, die keine Nebenwirkungen haben. Das funktionale Design zwingt das Programm dazu, als Ganzes zu arbeiten, im Gegensatz zu objektorientierten Sprachen, in denen viele Objekte versuchen, mithilfe dieser Nebenwirkungen miteinander zu kommunizieren, was die App in ein unvorhersehbares Chaos verwandelt. Wir haben dies in C # und Unity bei der Arbeit sehr gelitten.

Denis Mirzoev : Wenn die Sprache von Natur aus „faul“ ist, ist sie im Allgemeinen ausdrucksvoller. Algorithmen werden einfacher. Wenn keine Zwischenergebnisse verwendet werden, wird die Leistung erheblich gesteigert.

Igor Shevnin : Die „Faulheit“ hilft oft, aber wenn die Reihenfolge der Funktionsaufrufe wichtig ist, ist es manchmal sehr schwer zu verstehen, was los ist.

Doctor_Ryner : Wenn es stimmt, ist es wahrscheinlich ziemlich schnell.

Denis Mirzoev : In Bezug auf die Leistung ist es vergleichbar mit Java, aber nicht so schnell wie C.

Igor Shevnin : Es bietet sofort Erweiterungsunterstützung, mit der Sie die Sprache und das Typensystem nach Ihren Wünschen anpassen können. Es gibt viele Erweiterungen, die von der Community häufig verwendet werden und anständige Beispiele und Dokumentationen enthalten.

Doctor_Ryner : Die Standard-Prelude-Bibliothek hat viele schlechte Funktionen wie read, head, readFile, die eine Ausnahme auslösen und die App zum Absturz bringen können, anstatt Vielleicht zurückzugeben. Also muss ich Alternativen verwenden oder meine eigenen schreiben.

Igor Shevnin : Das größte Problem ist der Mangel an Standards, bis zu dem Punkt, an dem viele Leute die Standardbibliothek durch eine der Alternativen ersetzen, die in keiner Weise miteinander kompatibel sind. Die Aufteilung der Community in das, was die Standardbibliothek sein sollte, was in der Kerndistribution enthalten sein muss und was auf Erweiterungen verlagert werden kann ... Meiner Meinung nach behindert dies die Entwicklung der Sprache.

Denis Mirzoev : Es fehlen Tools: Es gibt keine richtige IDE, nur sehr wenige Leistungsbenchmarks, kein "schrittweises" Debugging - es ist ein grundlegendes Problem.

Für welche Projekte ist Haskell am besten geeignet?


YS : Für komplexe, sicherheits- und finanzbezogene Aufgaben, bei denen Fehler teuer sind.

Doctor_Ryner : Für alles, wo Sie rechnen, konvertieren und analysieren müssen. Ich bin überrascht, dass Haskell in Data Science-Anwendungen weniger beliebt ist als Python.

IS : Ich würde nicht riskieren, es für eingebettete Systeme (es ist schnell, aber es gibt immer noch erheblichen Speicheraufwand aufgrund von "faulem" Computing) oder kleine Skripte (wo seine strenge Natur nicht benötigt wird) zu verwenden. Es ist auch wichtig zu verstehen, wie schwierig es ist, Entwickler im Vergleich zu Mainstream-Sprachen zu finden.

John Doe : Zum Schreiben von Industriecode, der von anderen gelesen wird, benötigen Sie jedoch ein ganzes Team von Haskell-Entwicklern. Es gibt nicht viele von ihnen.

IS : Aber dank seiner prägnanten und strengen Natur können Sie Haskell für fast alles verwenden.

Ist es eine gute Idee, Ihre Entwicklungskarriere bei Haskell zu beginnen?


IS : Wahrscheinlich nicht, da die überwiegende Mehrheit der Codebasen, mit denen ein Entwickler arbeiten muss, nicht darauf geschrieben ist.

John Doe : Schlechte Idee! Nicht-ML-Sprachen - das ist fast alles in industriellen Anwendungen - wären ein Schock für Sie.

DS : Oft lernen die Leute zuerst Mathematik und wechseln später zur Programmierung. Theoretisch sollte das Erlernen einer Sprache, die viele mathematische Konzepte erfordert (algebraische Datentypen, reine Funktionen), einfacher sein als zwingende Sprachen. Ich denke es ist eine gute Idee.

Doctor_Ryner : Alle Rookie-Entwickler, mit denen ich zusammenarbeite, stelle ich zuerst Haskell vor. Menschen, die nicht über das Gepäck des imperativen Stils verfügen, lernen Funktionscode viel schneller, und selbst wenn sie später mit objektorientierten Sprachen arbeiten, verwenden sie häufig gute Architekturlösungen, weil sie an sie gewöhnt sind.

YS : Es ist am besten, mit ein paar grundlegend unterschiedlichen Sprachen zu beginnen, zum Beispiel C, Haskell und Smalltalk, in beliebiger Reihenfolge. Keine Sprache kann Ihnen ein umfassendes Verständnis der Landschaft vermitteln.

Haskell ist eine ziemlich alte Sprache. Ist es gut oder schlecht?


YS : Die Sprache wird sehr aktiv entwickelt, sie belastet die Abwärtskompatibilität nicht.

John Doe : Es wurde 1998 standardisiert, aber Sie werden es nicht bemerken: Bis heute gibt es ungefähr alle 6 Monate eine neue Compiler-Version, die möglicherweise die Abwärtskompatibilität beeinträchtigen kann.

DS : Haskell ist nicht alt, es hat sich einfach bewährt. Es führt (und wird) niemals sinnlose Veränderungen ein. Es ist also wahrscheinlich gut für die Gesundheit der Gemeinde.

Es wird oft gesagt, dass Haskell eine der am schwierigsten zu erlernenden Sprachen ist. Ist es wirklich?


Doctor_Ryner : Als Sprache selbst - nein. Der schwierigste Teil sind die verwendeten Abstraktionen. Eine Person, die noch nie einen Haskell-Code gesehen hat, könnte durch die Menge neuer Informationen und seltsamer Anweisungen verrückt werden. Was nicht hilft, ist, dass die Sprache viele Dinge „einschränkt“, die nicht zu ihrem Funktionskonzept passen.

John Doe : Ich habe zwei Monate Schlafenszeitlehrbücher, Handbücher und Tutorials gebraucht, um mein erstes Projekt zu kompilieren. Nach der endgültigen Kompilierung funktionierte es ein halbes Jahr lang unter Volllast (6.000 RPS-Durchschnitt, mit 15.000 Spitzen) ohne Änderungen.

DS : Ich wette, wenn Sie einem College-Studenten Haskell als Muttersprache geben und er damit weit kommt, würde die zwingende Programmierung für ihn kompliziert und weniger intuitiv aussehen.

IS : Es ist alles relativ. Von den gängigen Sprachen halte ich C ++ für die schwierigste. Theorembeweisende Sprachen (wie Agda oder Coq) sind konzeptionell schwieriger als Haskell. Haskell ist keine harte Sprache, aber es braucht Zeit, um seine Muster und Bibliotheken (sowohl Standard- als auch Drittanbieter-Sprachen) zu lernen.

Ist seine Komplexität gerechtfertigt?


IS : Muster und ein hohes Abstraktionsniveau sind gerechtfertigt, da dadurch Code kürzer und langlebiger wird. Aber ich denke, Operatoren, Funktionsnamen und viele andere Dinge hätten etwas benutzerfreundlicher sein können.

Doctor_Ryner : Oft ermöglicht Ihnen die Komplexität von Haskell, sehr kurze, flexible und modulare Lösungen zu erstellen .

YS : Ich würde sagen, nur die Effektkontrolle ist ein bisschen wackelig, obwohl sie fast immer keiner Kontrolle vorzuziehen ist. Und es gibt ein laufendes Projekt, um es einfacher zu machen.

John Doe : Für Leute, die an Python / PHP / was auch immer gewöhnt sind, fühlt sich Haskell von der Realität verdrängt. Für diejenigen, die sich noch nicht für die Theorie der Kategorien interessiert haben, ist es sehr schwer, von Grund auf neu zu lernen. Aber wenn Sie es verstehen, finden Sie einen neuen Ansatz zur Lösung eines Problems.

Es wird oft gesagt, Haskell sei keine Sprache für Entwickler, sondern für Mathematiker. Ist das der Grund, warum es nicht Mainstream ist?


DS : Es zeigt die Hauptidee der Hauptentwickler von Haskell: „Vermeiden Sie Erfolg um jeden Preis“. Das bedeutet nicht "Erfolg vermeiden", sondern "Erfolg zu teuer vermeiden".

Sie hätten Haskell populär machen können. Beispielsweise unterstützt Microsoft die Sprache. Sie hätten es zwingender machen und die Starrheit für die Popularität opfern können. Es gibt viele schmutzige Tricks, die sie hätten anwenden können, aber nie gemacht haben.

Sicher, die Sprache ist nicht beliebt, aber das bedeutet, dass die Qualität nicht darunter leidet. Die Vorteile von Haskell im Vergleich zu imperativen Sprachen liegen für mich auf der Hand und seine Probleme können alle gelöst werden. Ich glaube, dass es später populär wird.

YS : Nur Leute, die nichts darüber wissen, sagen es. Haskell wird häufig in der "realen" Entwicklung verwendet. Sie könnten wahrscheinlich Beispiele in Ihrer bevorzugten Suchmaschine finden. Insbesondere sind wir bei Kaspersky Labs sehr zufrieden mit Haskell und würden es nicht gegen etwas anderes eintauschen.

IS : Was ist die Sprache eines Mathematikers? Es ist entweder R / MatLab / Mathematica, das speziell für Statistiken und Berechnungen entwickelt wurde, oder Python, weil es einfacher ist und nicht so viel technischen Hintergrund erfordert. Aber nicht Haskell. Es hat Sachen aus der Algebra, wie Monoide, aber es hat praktische Anwendung.

Der Grund, warum C / C ++ / Java so beliebt ist, liegt darin, dass sie im Unternehmensbereich historisch sehr verbreitet waren. Sie füllten eine Nische. Aber heutzutage beginnen viele Unternehmen, Haskell und andere funktionale Sprachen zu verwenden.

Mit welchem ​​PL würden Sie Haskell vergleichen?


John Doe : Von den populären, wahrscheinlich mit Erlang. Aber Erlang ist einfacher zu lernen und zu schreiben.

DS : Ich kenne C, C ++, Java und Haskell. C ++ ist schrecklich und kann mit nichts verglichen werden. C eignet sich hervorragend für die Entwicklung auf niedriger Ebene. In allen anderen Anwendungen würde ich Haskell bevorzugen.

Die Wahl zwischen Java und Haskell ist schwieriger, hängt jedoch von der Anwendung ab. Zum Beispiel ist Java für Android besser, aber in Serveranwendungen sind sie fast gleich. Wenn die Umgebung - Tools, Bibliotheken - dies zulässt, wähle ich häufig Haskell.

Doctor_Ryner : Ich vergleiche mit C #. Nur Google "How to Do Vielleicht in C # und Haskell". Es ist seltsam, dass sich eine so streng funktionale Sprache wie Haskell viel flexibler und freier anfühlt. Aber in Wirklichkeit sind sie die polaren Gegensätze.

C # ist eine der objektorientiertesten Sprachen, und ihre Vorteile stehen im Gegensatz zu Haskell. C # zwingt Sie immer dazu, viele zusätzliche Dinge zu schreiben, was den Code verlangsamt und ihn oft weniger elegant macht. Nach Haskells kurzen und ordentlichen Lösungen ist es schwierig, zurück zu gehen.

IS : Mit Rust und bisher gewinnt Rust wahrscheinlich. Es nimmt viel von Haskell und anderen funktionalen Sprachen, kombiniert aber funktionale und zwingende Ansätze, und die Entwickler haben die Entwicklung viel intelligenter gehandhabt.

Wie ist Ihre Meinung zur Haskell-Community?


John Doe : Die überwiegende Mehrheit der Menschen ist sehr freundlich und hilfsbereit, was einen schönen Kontrast zu vielen anderen Sprachen darstellt.

Doctor_Ryner : Haskell-Gemeinschaften sind oft voller schrecklich kluger Leute. Lokale Memes über Doktoranden und Hochschulen existieren aus einem bestimmten Grund. In anderen Communities diskutieren die Leute meistens über regelmäßige Produktionsprobleme und Datenstrukturen, während in einem Haskell-Chat über Monaden, anwendbare Funktoren, verrückte Typen und ähnliches gesprochen wird.

Sie lernen immer etwas, woran Sie noch nie gedacht haben.

Es wird gesagt, dass Haskell-Entwickler zu voll von sich sind. Ist es wahr


DS : Ja. Ich habe das Gefühl, es liegt daran, dass sie ihre Sprache wirklich mögen und enttäuscht sind, wie unbeliebt sie ist.

John Doe : Nichts dergleichen.

Doctor_Ryner : Die Leute sagen wahrscheinlich, dass viele Mainstream-Entwickler, die sich über einen Haskellisten ärgern, über funktionale Programmierung und ihre Vorteile sprechen. Der Haskellist ärgert sich unterdessen darüber, dass niemand auf ihn hört und Terminologie herumwirft, und wird daher als „voll von sich selbst“ bezeichnet.

IS : Es ist ein bisschen hart, sie so zu nennen. Dies liegt wahrscheinlich daran, dass funktionale Programmierung, OOP, Unterschiede zwischen OOP-Klassen und Unionstypen, das Erweiterungsproblem und viele andere Definitionen langsam zu einem zusammenhängenden Bild werden und es dann schwierig ist, Menschen zu verstehen, die die heiligen Kriege von OOP gegen FP fortsetzen.

Warum sind FP-Sprachen so nisch?


DS : Ihre Vorteile reichen nicht aus, um Programmierer zu interessieren. Schwer zu lernen hilft auch nichts. Werkzeugprobleme schrecken auch die Leute ab, obwohl dieses Problem wahrscheinlich gelöst würde, wenn mehr Leute interessiert wären. Es ist ein Teufelskreis.

IS : Nun, FP-Konzepte dringen langsam in andere Sprachen ein ...

Doctor_Ryner : Die Grundprinzipien von FP und seinen Sprachen sind bereits ziemlich weit verbreitet. Sogar Sharp hat Linq und einige andere ähnliche Bibliotheken. Aber rein funktionale Sprachen haben wahrscheinlich einfach zu viele neuartige Konzepte, um populär zu sein.

Vergessen Sie nicht, dass die Hardware vor 20 Jahren noch nicht schnell genug war, um mit funktionalen Sprachen umzugehen, sodass sie erst vor kurzem in den Mainstream eingetreten ist und Haskell selbst nur wächst.

Source: https://habr.com/ru/post/de441350/


All Articles