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
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 startenDas 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:mainführt Ein-/Ausgabe (IO) aus und liefert nichts (())putStrLngibt Text mit Zeilenumbruch aus,printzeigt 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;dofasst mehrere IO-Aktionen zusammen- Ausdrücke haben Werte, auch
ifundlet - Funktionsaufruf ohne Klammern:
f x y ghcizum Ausprobieren,runghcfür Skripte
Übungsaufgabe
Gib mit putStrLn und show das Ergebnis von 6 * 7 aus.
Quiz zur Selbstkontrolle
Welche Eigenschaft hat Haskell?
- Rein funktional und statisch typisiert (richtig)
- Dynamisch typisiert
- Objektorientiert
- Maschinennah
Wie ruft man max mit 3 und 9 auf?
- max 3 9 (richtig)
- max(3, 9)
- max[3, 9]
- max 3, 9
Wofür steht IO () im Typ von main?
- Eine Aktion mit Ein-/Ausgabe ohne Rückgabewert (richtig)
- Ein Fehlercode
- Eine Liste
- Eine Zahl
Weiter im Kurs
Weiter: Typen und Funktionen
Alle Kapitel: Haskell im Überblick