Kann ein Programm dir sagen, dass es falsch ist, bevor es läuft?
Eine Tabellenkalkulation, die einen Namen zu einer Zahl addiert, liefert eine seltsame Antwort, und du merkst es erst später. Haskell verlangt von dir, zu sagen, welche Art von Ding jede Funktion bekommt und zurückgibt, und prüft das, bevor etwas läuft. Dann können ganze Arten von Fehlern gar nicht passieren.
Am Ende dieser Lektion
Notiz
Ich kann eine Haskell-Funktion lesen und ausführen und sagen, was ihr Typ mir verrät.
Schlüsselwörter
- Funktion: etwas, das einen Wert bekommt und einen Wert zurückgibt.
- Typ: die Art eines Werts, zum Beispiel
Intfür eine ganze Zahl oderStringfür Text. - Typsignatur: die Zeile, die einer Funktion ihren Typ gibt, zum Beispiel
square :: Int -> Int. - Liste: mehrere Werte desselben Typs in einer Reihenfolge, geschrieben
[1, 2, 3]. - Faltung (fold): eine Art, alle Elemente einer Liste zu einem Wert zusammenzufassen.
Zum Einstieg: was du schon weißt
Notiz
Antworte im Kopf. 1. Wenn in der Mathematik f(x) = x * x, was ist f(5)? 2. Ist 7 dieselbe Art von Ding wie "seven"? 3. Was ist die Summe der Liste 1, 2, 3? Antworten: 25; nein, das eine ist eine Zahl und das andere Text; 6.
Bevor du anfängst
Notiz
Klicke oben in der Leiste dieser Lektion auf Lab starten und warte, bis dort steht, dass es läuft. Es gibt einen Container, haskell. Im Browser öffnet sich nichts, also nutze das Terminal, in dem docker exec haskell einen Befehl darin ausführt. Der Compiler braucht jedes Mal ein paar Sekunden zum Start. Alles, was ausgegeben wird, ist Englisch, egal in welcher Sprache diese Seite steht. Jede Schaltfläche Ausführen unten tippt ihren Befehl ins Terminal deines Labs, einen nach dem anderen in derselben Sitzung. Wenn du zuschauen oder eigene Befehle tippen willst, klicke in der Leiste auf Terminal öffnen (neuer Tab).
Eine Funktion hat eine Typsignatur
Dieser Befehl gibt die erste Datei aus. Die Zeile square :: Int -> Int ist eine Typsignatur. Lies sie so: „square bekommt einen Int und gibt einen Int zurück“. Die nächste Zeile sagt, wie: square n = n * n. Eine Funktion hat hier keine Nebenwirkungen: Gib ihr denselben Wert, und du bekommst dieselbe Antwort. -- beginnt einen Kommentar.
docker exec haskell cat Basics.hsHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine Datei ausführen oder nach einer Funktion fragen
runghc führt die Datei aus. Ihr main gibt drei Zeilen aus: Hello, Haskell!, dann 49, dann (True,False). Die Optionen ghc -e berechnen einen Ausdruck mit geladener Datei: Die erste fragt nach dem Typ von square und gibt square :: Int -> Int aus, die zweite ruft sie auf und gibt 144 aus.
docker exec haskell runghc Basics.hsHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
docker exec haskell ghc -e ":type square" Basics.hsHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
docker exec haskell ghc -e "square 12" Basics.hsHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Prüfe dich
Tipp
Was sagt dir isEven :: Int -> Bool, bevor du den Code liest? Antwort: Sie bekommt eine ganze Zahl und gibt True oder False zurück.
Eine Liste bearbeitet man mit Funktionen
map wendet eine Funktion auf jedes Element an, und filter behält die Elemente, die einen Test bestehen. Der erste Befehl quadriert 1 bis 5 mit square und addiert sie mit sum: Er gibt 55 aus. Der zweite behält die geraden Zahlen von 1 bis 10 und gibt [2,4,6,8,10] aus. Keiner ändert die ursprüngliche Liste: Jeder liefert einen neuen Wert.
docker exec haskell ghc -e "sum (map square [1 .. 5])" Basics.hsHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
docker exec haskell ghc -e "filter even [1 .. 10]"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine Funktion kann sich selbst aufrufen, und eine Faltung tut es für dich
mySum in Fold.hs addiert eine Liste, indem es das erste Element zur Summe des Rests addiert und bei der leeren Liste aufhört. Dieser Befehl gibt 6 aus. Der zweite erledigt dieselbe Arbeit mit dem eingebauten foldr, das eine Liste zu einem Wert faltet: Er gibt 5050 aus, die Summe von 1 bis 100.
docker exec haskell ghc -e "mySum [1, 2, 3]" Fold.hsHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
docker exec haskell ghc -e "foldr (+) 0 [1 .. 100]"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Der Compiler prüft die Typen
Dieser Befehl gibt square Text statt einer Zahl. Nichts läuft. Der Compiler gibt einen Fehler aus, der mit <interactive> beginnt und sagt, dass er den Typ [Char], also Text, nicht mit Int zusammenbringt. Lies den Fehler von oben: Er nennt den Teil deines Ausdrucks, der falsch ist. Der Code in Klammern und das Layout können sich zwischen Versionen unterscheiden.
docker exec haskell ghc -e "square \"two\"" Basics.hsHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein häufiger Fehler
Warnung
Viele denken, eine Typsignatur sei nur ein Kommentar für die Leserin oder den Leser. Das stimmt nicht. Der Compiler prüft jede, und passt der Code nicht, läuft gar nichts. Schreibe die Signatur zuerst, wenn du kannst: Sie sagt, was du gemeint hast, und der Compiler meldet sich, wenn der Code etwas anderes sagt.
Abschlusskontrolle
Tipp
Antworte, ohne zurückzublättern. 1. Was bedeutet Int -> Bool? 2. Was ergibt filter even [1 .. 10]? 3. Wann findet der Compiler einen Typfehler: bevor das Programm läuft oder danach? 4. Was macht eine Faltung mit einer Liste? Antworten: bekommt eine ganze Zahl und gibt True oder False zurück; [2,4,6,8,10]; davor, also läuft nichts; sie fasst alle Elemente zu einem Wert zusammen.
Für Lehrkräfte
Tipp
Diese Lektion ist ein kleines Beispiel für eine Lektion, die in einem Lab durchgeführt wird: Die Schritte und die Schaltflächen Ausführen sind die Lektion, und das Lab ist die Kopie jedes Lernenden. Das Lab ist ein Container mit dem GHC-Compiler und vier kleinen Dateien, und hier wird nichts automatisch bewertet: Die Lernenden geben die Ausdrücke ab, die sie ausprobiert haben, mit der jeweiligen Ausgabe, eine eigene Funktion mit ihrem Typ und einem Aufruf, der sie in Aktion zeigt, und einen Satz dazu, was eine Typsignatur der Leserin oder dem Leser sagt. Kernpunkte: 1. Eine Funktion bekommt einen Wert und gibt einen zurück. 2. Eine Typsignatur sagt, was eine Funktion bekommt und zurückgibt. 3. Listen bearbeitet man mit Funktionen wie map und filter. 4. Eine Funktion kann sich selbst aufrufen, und eine Faltung erledigt dieselbe Arbeit. 5. Der Compiler prüft die Typen, bevor etwas läuft. Häufiger Fehler: eine Signatur für einen Kommentar zu halten. Material: das Lab und sein Terminal. Tipp: Lassen Sie den Typ einer Funktion vor ihrem Rumpf schreiben. Jede Antwort ist genau und jedes Mal gleich; der erste Befehl nach dem Start braucht ein paar Sekunden. Namen und Meldungen sind Englisch, egal in welcher Sprache die Seite steht.