EMZETT.
Login

Kurz: Haskell (benannt nach Haskell Curry, erster Standard 1990) ist eine rein funktionale, statisch typisierte Sprache mit Lazy Evaluation (Werte werden erst berechnet, wenn man sie braucht).

Teil des Kurses Haskell

Kapitel 1 von 9 im Kurs Haskell. Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

Was ist Haskell?

Haskell (benannt nach Haskell Curry, erster Standard 1990) ist eine rein funktionale, statisch typisierte Sprache mit Lazy Evaluation (Werte werden erst berechnet, wenn man sie braucht). Es gibt keine Variablen im üblichen Sinn und keine Schleifen: Programme bestehen aus Funktionen, die aus Eingaben Ausgaben berechnen, ohne Nebenwirkungen. Der Compiler (GHC) findet durch das starke Typsystem viele Fehler vor dem Start.

Haskell wird in Compilern, Finanzsoftware (Standard Chartered, Jane Street nutzt OCaml), Blockchain-Projekten (Cardano), Pandoc, Xmonad und vor allem in Forschung und Lehre eingesetzt. Wer Haskell versteht, programmiert auch in anderen Sprachen besser: Ideen wie map/filter, Pattern Matching, Optional-Typen und Immutability stammen aus der funktionalen Welt.

Installation und Ausführen

Installiere GHCup (haskell.org/ghcup), das GHC, Cabal und Stack bereitstellt.

ghci                        # interaktive Umgebung (Ausdrücke direkt testen)
runghc Hallo.hs             # Datei wie ein Skript ausführen
ghc Hallo.hs && ./Hallo     # kompilieren und starten
cabal run                   # Projekt starten

Das erste Programm

Hallo.hs

main :: IO ()
main = do
  putStrLn "Hallo Haskell!"
  putStrLn ("2 + 3 = " ++ show (2 + 3))
  print (length "Haskell")
  print [1, 2, 3]
  print "Text mit Anführungszeichen"

Ausgabe:

Hallo Haskell!
2 + 3 = 5
7
[1,2,3]
"Text mit Anf\252hrungszeichen"
  • main :: IO () ist die Typsignatur: main führt Ein-/Ausgabe (IO) aus und liefert nichts (())
  • putStrLn gibt Text mit Zeilenumbruch aus, print zeigt jeden Wert (show)
  • ++ verbindet Listen und Texte
  • Kommentare: -- bis Zeilenende, {- mehrzeilig -}
  • Die Einrückung gliedert Blöcke (wie in Python)

Ausdrücke statt Anweisungen

In Haskell ist fast alles ein Ausdruck mit Wert, auch if:

main :: IO ()
main = do
  print (3 + 4 * 2)
  print (if 5 > 3 then "ja" else "nein")
  print (let a = 10; b = 20 in a * b)
  print (max 3 9, min 3 9)
  print (7 `div` 2, 7 `mod` 2, 7 / 2)
  print (2 ^ 10, 2 ** 0.5, sqrt 16, pi)
  print (True && False, True || False, not True)
  print (succ 'a', pred 10, fromEnum 'A', toEnum 66 :: Char)
  print (show 42 ++ "!", read "7" + 1)
  print (compare 1 2, 3 == 3, 3 /= 4)

Ausgabe:

11
"ja"
200
(9,3)
(3,1,3.5)
(1024,1.4142135623730951,4.0,3.141592653589793)
(False,True,False)
('b',9,65,'B')
("42!",8)
(LT,True,True)

Funktionsaufrufe schreibt man ohne Klammern: max 3 9 statt max(3, 9). Der Aufruf bindet am stärksten: f x + 1 bedeutet (f x) + 1. Mit Backticks wird eine Funktion zum Infix-Operator: 7 `div` 2.

Merke

  • Haskell ist rein funktional, statisch typisiert und lazy
  • main :: IO () ist der Einstiegspunkt; do fasst mehrere IO-Aktionen zusammen
  • Ausdrücke haben Werte, auch if und let
  • Funktionsaufruf ohne Klammern: f x y
  • ghci zum Ausprobieren, runghc für Skripte

Übungsaufgabe

Gib mit putStrLn und show das Ergebnis von 6 * 7 aus.

Quiz zur Selbstkontrolle

Weiter im Kurs

Weiter: Typen und Funktionen

Alle Kapitel: Haskell im Überblick