Warum Haskell?
(gtf.io)-
„Unpraktisch“, „akademisch“, „nischig“
- Das sind die Reaktionen, die Menschen zeigen, wenn sie erfahren, dass Haskell meine Lieblingsprogrammiersprache ist
- Ich nutze es nicht nur für Hobbyprojekte, sondern auch zum Aufbau echter Webserver
- Bei Converge leite ich Teams, die mit Haskell arbeiten
-
Missverständnisse über Haskell
- Probleme, die sich mit einer universellen Programmiersprache lösen lassen, können auch in anderen Sprachen gelöst werden
- Viele Funktionen, die in Python, Rust, Typescript usw. eingeführt werden, wurden von Haskell inspiriert oder sind dort robuster umgesetzt
- Es wirkt wie eine Abwandlung der Ideologie „Choose boring technology“
- Es gibt die falsche Vorstellung, Programmierung sei keine Mathematik und mathematische Elemente müssten ausgeschlossen werden
-
Ziel dieses Artikels
- Es soll logisch erklärt werden, warum Haskell für die meisten Programmierer die beste Wahl ist
- Besonders nützlich ist es für Menschen, die produktiv robuste Software schreiben möchten
- Auch die unterhaltsamen Seiten des Software-Schreibens werden hervorgehoben
-
Verlernen und neu lernen
- Die meisten Programmierer sind an das imperative Paradigma gewöhnt
- Haskell ist eine rein funktionale Sprache mit einer steilen Lernkurve
- Die Sprache Haskell selbst ist leicht zu lernen, wenn man sich auf eine einfache Teilmenge beschränkt
- Funktionale Programmierung verlangt einen vollständigen Wandel darin, wie Programme aufgebaut werden
- Dieser Prozess hilft dabei, als Programmierer zu wachsen
- Zitat von Alan Perlis:
Eine Sprache, die Ihre Denkweise über Programmierung nicht beeinflusst, ist es nicht wert, gelernt zu werden.
Kurze Erklärung zur Syntax
-
::kennzeichnet eine Typ-Signatur (z. B.myThing :: String) -
Funktionsaufrufe verwenden keine Klammern; die Argumente werden nach dem Funktionsnamen durch Leerzeichen getrennt aufgeführt (z. B.
doSomething withThis withThat) -
In Typ-Signaturen sind Kleinbuchstaben Typvariablen und stehen für beliebige Typen (z. B.
head :: [a] -> a) -
Es gibt zwei Arten von Pfeilen,
->und=>:->beschreibt den Typ einer Funktion (z. B.add1 :: Int -> Int)=>beschreibt Einschränkungen für Typvariablen und steht immer zuerst (z. B.add1 :: Num a => a -> a)
-
Kommentare beginnen mit
-- -
returnist eine normale Funktion und bedeutet nicht das, was man erwartet -
doist syntaktischer Zucker, damit es imperativ aussieht -
Es gibt mehrere Möglichkeiten, lokalen Variablen Werte zuzuweisen:
let x = <something> in <expression>oder
x <- <something> -
Weniger Fehler machen
- In vielen Sprachen schreibt man viele Testfälle, damit Code „korrekt“ wird
- Haskell reduziert diese Last stark durch sein Typsystem und die reine funktionale Programmierung
- Haskells mächtiges Typsystem liefert konkrete Garantien über Programme und setzt sie strikt durch
- Merkmale des Typsystems:
- Keine nullable Typen
- Fehlbare Berechnungen können ausgedrückt werden
- Pattern Matching und Vollständigkeitsprüfung
- Primitive Obsession lässt sich kostenlos vermeiden
-
Vorteile fehlender Nullwerte
- Da kein
null-Wert existiert, weiß man immer, ob ein Wert den erwarteten Typ hat - Das verhindert Laufzeitfehler und verkleinert die Fehleroberfläche
- Da kein
-
Darstellung fehlbarer Berechnungen
- Mit den Typen
MaybeundEitherlassen sich Berechnungen, die fehlschlagen können, explizit ausdrücken Maybesteht für Berechnungen, die ein Ergebnis haben können oder auch nichtsafeHead :: [a] -> Maybe aEitherkann zwei Arten von Werten haben (Left aoderRight b)validateAddress :: String -> Either AddressParseError ValidAddress
- Mit den Typen
-
Pattern Matching und Vollständigkeitsprüfung
- Alle Eingabedomänen müssen behandelt werden; andernfalls meldet der Compiler einen Fehler
- Das verhindert Laufzeitfehler und erhöht die Zuverlässigkeit des Programms
-
Vermeidung von Primitive Obsession
- Mit
newtypelassen sich leicht semantisch aussagekräftigere Typen erzeugen
newtype VenueName = VenueName String newtype EventName = EventName String - Mit
-
Vorteile reiner funktionaler Programmierung
- Daten sind unveränderlich, sodass man sich nicht um Zustandsmutationen kümmern muss
- Nebeneffekte werden explizit behandelt, und Funktionen hängen ohne Nebeneffekte nur von ihren Eingaben ab
- Das erhöht Vorhersagbarkeit und Stabilität von Programmen
-
Explizite Behandlung von Nebeneffekten
- Mit der
IO-Monade werden Nebeneffekte im Code getrennt und kontrolliert - An der Typ-Signatur einer Funktion erkennt man, dass sie Nebeneffekte auslöst
sendGreetings :: User -> IO Response - Mit der
-
Monaden und Effektkontrolle
- Mit Typeclasses und Monaden lässt sich präzise kodieren, welche Effekte eine Funktion ausführen darf
- Das verhindert unbeabsichtigte Nebeneffekte und erhöht die Stabilität des Codes
-
Faktoren für höhere Produktivität
- Das mächtige Typsystem und der rein funktionale Charakter erleichtern Code-Wiederverwendung und die Verallgemeinerung von Konzepten
- Mit Konzepten wie
FunctorundMonoidlassen sich dieselben Muster auf verschiedene Datenstrukturen anwenden
fmap (+2) [1, 2, 3] -- [3, 4, 5] fmap (+2) (Just 2) -- Just 4 -
Refactoring ohne Angst
- Durch die Strenge des Compilers ist das Risiko geringer, bei Codeänderungen neue Bugs einzuführen
- Das Typsystem ermöglicht es, die Domäne eines Programms präzise auszudrücken, sodass man Code mit mehr Sicherheit ändern kann
-
Besseres Verständnis des Programms
- Mit deklarativer Programmierung lässt sich die Problemdomäne präzise ausdrücken
- Die Bedeutung des Programms wird leichter verständlich und seine Zuverlässigkeit steigt
- Unnötige Komplexität wird entfernt, wodurch eine vernünftige Argumentation über das Programm möglich wird
-
Algebraische Datentypen und Typeclasses
- Innerhalb von Haskell lassen sich domänenspezifische Sprachen aufbauen
- Das hilft dabei, Programme zu verstehen und zu warten
-
Beispielprogramm
- Durch das Schreiben eines einfachen Buchhaltungstools werden Haskell-Konzepte praktisch angewendet
Epilog
- Haskell zu verwenden macht Spaß und ist produktiv
- Die Kombination aus einem starken, ausdrucksstarken Typsystem und reiner funktionaler Programmierung macht Haskell besonders
- Andere Sprachen führen solche Funktionen ebenfalls ein, aber in Haskell sind diese Eigenschaften grundlegend verankert
- Haskell zu lernen wird Ihre Denkweise über Programmierung verändern
Meinung von GN⁺
-
Der Lernwert von Haskell
- Es hilft dabei, den eigenen Horizont als Programmierer zu erweitern
- Wer das funktionale Programmierparadigma versteht, kann auch in anderen Sprachen besseren Code schreiben
-
Der Aufstieg funktionaler Programmierung
- Sie hat Stärken bei Parallelverarbeitung und Nebenläufigkeit und passt daher gut zu modernen Computing-Umgebungen
- Durch die Kontrolle von Nebeneffekten lässt sich vorhersagbarer Code schreiben
-
Vergleich mit anderen Sprachen
- Es gibt auch Sprachen wie Rust oder Scala, die funktionale Programmierung unterstützen, aber Haskells Reinheit und Typsystem sind einzigartig
- Beim Lernen neuer Sprachen können Haskell-Konzepte hilfreich sein
-
Praxistauglichkeit
- Die anfängliche Lernkurve ist steil, aber die Produktivität steigt entsprechend der investierten Zeit
- Nützlich ist es besonders in komplexen Systemen oder fehlerkritischen Domänen
-
Community und Ökosystem
- Die Haskell-Community ist aktiv, und es werden kontinuierlich verschiedene Bibliotheken und Tools entwickelt
- Durch die Teilnahme an Open-Source-Projekten kann man die eigenen Fähigkeiten verbessern
3 Kommentare
Ich habe mit F# begonnen, das um Praxisnähe ergänzt wurde.
ADT und Pattern Matching sind gut, aber bitte verschont mich mit Gerede über Monaden und Funktoren.
Hacker-News-Kommentare
Haskell erzwingt das Schreiben totaler Funktionen statt partieller Funktionen
Ich verwende Haskell seit 10 Jahren, und die Werkzeuge haben sich stark verbessert
ghcup,cabal-Sandboxing und HLS sind stabilHaskells Typsystem beweist nicht, dass Funktionen total sind
Die Haskell-Sprache ist gut, aber das Ökosystem hat noch einen weiten Weg vor sich
Ich möchte Haskell oder eine andere funktionale Sprache beruflich verwenden
Haskell hat meine Denkweise beim Programmieren und die Code-Architektur stark beeinflusst
Haskell experimentiert auf Sprachebene mit Laziness
Haskells extreme Reinheit und Unveränderlichkeit sind ein Problem
Haskell eignet sich sehr gut für Business-Logic-Software (BLOBS)