1
1
mirror of https://github.com/thma/WhyHaskellMatters.git synced 2024-07-14 16:50:26 +03:00
In this article I try to explain why Haskell keeps being such an important language by presenting some of its most important and distinguishing features and detailing them with working code examples. The presentation aims to be self-contained and does no
Go to file
Mahler, Thomas fd3195ec54 clean up
2020-03-05 17:26:30 +01:00
.github/workflows Update haskell.yml 2020-02-08 13:18:47 +01:00
src clean up 2020-03-05 17:26:30 +01:00
test clean up 2020-03-05 17:26:30 +01:00
.gitignore initial commit 2020-02-05 21:29:29 +01:00
LICENSE Initial commit 2020-02-05 20:41:17 +01:00
package.yaml clean up 2020-03-05 17:26:30 +01:00
README.md clean up 2020-03-05 17:26:30 +01:00
Setup.hs initial commit 2020-02-05 21:29:29 +01:00
stack.yaml initial commit 2020-02-05 21:29:29 +01:00

Why Haskell Matters

  • Funktionen sind 1st class citizens (higher order functions, Funktionen könen neue Funktionen erzeugen und andere Funktionen als Argumente haben)

  • Abstraktion über Resource management und Abarbeitung (=> deklarativ)

  • Immutability ("Variables do not Vary")

  • Seiteneffekte müssen in Funktions signaturen explizit gemacht werden. D.H wenn keine Seiteneffekt angegeben ist, verhindert der Compiler, dass welche auftreten ! Damit lässt sich Seiteneffektfreie Programmierung realisieren ("Purity")

  • Evaluierung in Haskell ist "non-strict" (aka "lazy"). Damit lassen sich z.B. abzählbar unendliche Mengen (z.B. alle Primzahlen) sehr elegant beschreiben. Aber auch kontrollstrukturen lassen sich so selbst bauen (super für DSLs)

  • Static and Strong typing (Es gibt kein Casting)

  • Type Inferenz. Der Compiler kann die Typ-Signaturen von Funktionen selbst ermitteln. (Eine explizite Signatur ist aber möglich und oft auch sehr hilfreich für Doku und um Klarheit über Code zu gewinnen.)

  • Polymorphie (Z.B für "operator overloading", Generische Container Datentypen, etc. auf Basis von "TypKlassen")

  • Algebraische Datentypen (Summentypen + Produkttypen) AD helfen typische Fehler, di man von OO Polymorphie kenn zu vermeiden. Sie erlauben es, Code für viele Oerationen auf Datentypen komplett automatisch vom Compiler generieren zu lassen).

  • Pattern Matching erlaubt eine sehr klare Verarbeitung von ADTs

  • Eleganz: Viele Algorithmen lassen sich sehr kompakt und nah an der Problemdomäne formulieren.

  • Data Encapsulation durch Module

  • Weniger Bugs durch

    • Purity, keine Seiteneffekte

    • Starke typisierung. Keine NPEs !

    • Hohe Abstraktion, Programme lassen sich oft wie eine deklarative Spezifikation des Algorithmus lesen

    • sehr gute Testbarkeit durch "Composobility"

    • Memory Management (sehr schneller GC)

    • Modulare Programme. Es gibt ein sehr einfaches aber effektive Modul System und eine grosse Vielzahl kuratierter Bibliotheken.

    ("Ich habe in 5 Jahre Haskell noch nicht ein einziges Mal debuggen müssen")

  • Performance: keine VM, sondern sehr optimierter Maschinencode. Mit ein wenig Feinschliff lassen sich oft Geschwindigkeiten wie bei handoptimiertem C-Code erreichen.