Haskell-Lab: funktionale Programmierung mit Funktionen und Typen, im Browser

Dieses Lab gibt jedem Lernenden einen eigenen Haskell-Compiler mit vier kleinen Dateien zum Lesen, Ausführen und Ändern: Funktionen und Typen, Listen, Faltungen und Rekursion und ein eigener Typ. Ein Haskell-Programm besteht aus Funktionen, die Werte bekommen und Werte zurückgeben, und jede Funktion hat einen Typ, den der Compiler prüft, bevor etwas läuft.

Es ist kein Angriffs-Lab. Jede Kopie hat keinen Weg ins Internet und keinen zu anderen Lernenden, es kann also nichts hineingeladen werden, und nichts darin kann jemand anderen erreichen. Es hat nur den Compiler und die Bibliotheken, die mit ihm kommen: Zusätzliche Pakete lassen sich nicht installieren, also gibt es weder cabal install noch stack.

Was die Lernenden lernen

Dass ein Programm aus Funktionen gebaut sein kann und dass ein Typ sagt, was jede bekommt und zurückgibt. Die Lernenden lesen eine Typsignatur, führen eine Datei aus, berechnen einen Ausdruck, wenden map und filter auf eine Liste an, schreiben eine Funktion, die sich selbst aufruft, und sehen eine Faltung dieselbe Arbeit tun, und sie begegnen einem Typfehler, der ein Programm anhält, bevor es läuft. Eine vierte Datei fügt einen eigenen Typ mit zwei Formen hinzu und eine Funktion, die ihn zerlegt, indem sie prüft, welche Form es ist. Es eignet sich als Einführung in Programmierparadigmen; prüfen Sie den genauen Wortlaut in der Einheit Ihrer eigenen Prüfungsstelle, hier wird keiner zitiert.

Im Browser ausführen

Das Lab startet einen Dienst, haskell, aus dem offiziellen Image haskell, als Konto ohne Sonderrechte. Es gibt keine Webseite, daher hat die Leiste des Labs keinen Link unter Im Browser, und das Terminal ist der Weg, Code auszuführen. Es erreicht den Compiler mit docker exec haskell, gefolgt von runghc und einem Dateinamen, um eine Datei auszuführen, oder von ghc -e und einem Ausdruck in Anführungszeichen, um einen Ausdruck zu berechnen. Der Compiler braucht jedes Mal ein paar Sekunden zum Start. Jede Antwort ist jedes Mal gleich, und alles, was ausgegeben wird, ist Englisch, egal in welcher Sprache die Seite steht.

Für ein Gespräch mit dem Compiler klicken Sie auf Terminal öffnen und tippen docker exec -it haskell ghci Lists.hs. Tippen Sie am Prompt ghci> einen Ausdruck und drücken Sie die Eingabetaste, etwa map (* 2) [1, 2, 3], das [2,4,6] ausgibt. Mit :t und einem Namen sehen Sie seinen Typ, mit :quit verlassen Sie ihn.

  1. Container-Seite öffnen. Öffnen Sie in der Leiste „Entwickeln“ und wählen Sie „Einen Container ausführen“. Die Seite kann jeder öffnen, und das Git-Lab und das SQL-Lab starten ohne Konto. Alle anderen Labs brauchen ein kostenloses Konto: Erstellen Sie eines, melden Sie sich an und klicken Sie dann auf „Starten“.
  2. Lab suchen. Die Karte „Beispiel-Labs“ listet alle Beispiele auf. Suchen Sie Haskell: Funktionen, Typen und Listen.
  3. Auf „Starten“ klicken. „Starten“ führt das Lab unverändert mit einem einzigen Klick aus. „Zuerst die Datei bearbeiten“ öffnet die Compose-Datei, damit Sie sie vor dem Start ändern können.
  4. Öffnen. Es gibt keine Webseite zu öffnen. Klicken Sie auf der Seite des Labs auf „Terminal öffnen“ und tippen Sie docker exec haskell runghc Basics.hs, um die erste Datei auszuführen: Sie gibt Hello, Haskell! aus, dann 49, dann (True,False).

Was die Lernenden abgeben sollen

Die Ausdrücke, die sie ausprobiert haben, und was jeder ausgab: einen, der eine Funktion aus einer Datei aufruft, einen, der map oder filter auf eine Liste anwendet, und einen, bei dem der Compiler einen Typfehler meldet. Dann eine eigene Funktion in Basics.hs mit ihrer Typsignatur und einem Aufruf, der sie in Aktion zeigt, und ein bis zwei Sätze in eigenen Worten dazu, was eine Typsignatur der Leserin oder dem Leser sagt. Nichts wird automatisch bewertet: Die Funktion und die Sätze zeigen, ob es verstanden wurde. Für anspruchsvollere Arbeit lassen Sie zuerst die Signatur schreiben und sagen, was sie verspricht.

Eine Grundlagenlektion zu diesem Lab

Haskell Basics ist eine kleine Lektion, die in diesem Lab bearbeitet wird. Darin liest ein Lernender eine Funktion und ihren Typ, führt eine Datei aus, wendet eine Funktion auf eine Liste an, faltet eine Liste und begegnet einem Typfehler.

Kostenlose persönliche Konten haben sie im Modul Basics, das auf der Startseite liegt, und jede Einrichtung kann sie aus dem Basics-Ordner der Bibliothek kopieren. Sie ist absichtlich klein: Sie zeigt einer Lehrkraft, was eine in einem Lab bearbeitete Lektion ist, den Rest übernimmt das Lab. Kopieren Sie sie in ein eigenes Modul, um sie zu ändern.

Der Code auf GitHub

Die Compose-Datei hat kein Dockerfile: Sie startet ein einziges offizielles öffentliches Image, Haskell mit GHC, auf Version 9.10.1 festgelegt, als Konto ohne Sonderrechte mit 384 MB Speicher. GHC ist der Hungrige: Eine Datei auszuführen, einen einzelnen Ausdruck, den interaktiven Prompt und ein vollständiges Kompilieren einer Datei wie diesen erreichte knapp 250 MB, gerechnet mit dem Cache der Dateien des Compilers selbst, und dieselbe Arbeit endete innerhalb von 192 MB, 384 MB lassen also Luft. Image und Compiler stehen unter freizügigen Open-Source-Lizenzen und werden nicht von uns verteilt. Die Datei schreibt beim ersten Start vier kleine Übungsdateien und hält sie auf einem Volume, sodass das, was ein Lernender ändert, nach einem Stopp und einem Start noch da ist. Die Grenzen sind ehrlich: Es gibt keinen Weg nach draußen, also keine zusätzlichen Pakete, und ein sehr großes Programm kann mehr Speicher brauchen, als das Lab hat.

Als Aufgabe stellen

Sagen Sie in der Aufgabe, was abzugeben ist.

  1. Lab erstellen. Fügen Sie in Ihrem Modul eine Aufgabe hinzu und wählen Sie die Karte „Container-Lab“, dann „In einem GitHub-Repository“. Geben Sie https://github.com/mitsurutech/lab-haskell-lab mit dem Branch main an. Die Compose-Datei ist standardmäßig compose.yaml. Forken Sie das Repository zuerst, wenn Sie es ändern möchten, um zum Beispiel weitere Funktionen zu den Startdateien hinzuzufügen.
  2. Veröffentlichen und ausprobieren. „Veröffentlichen“ legt den Commit fest, den Sie gesehen haben. Eine spätere Änderung im Repository verändert also kein Lab, das Sie bereits gestellt haben. Starten Sie zuerst Ihre eigene Kopie.
  3. Zuweisen. Weisen Sie es wie jede Aufgabe zu, auf Wunsch mit Fälligkeitsdatum, und schreiben Sie in die Aufgabe, was zu tun ist und was abgegeben werden soll.
  4. Abgaben bewerten. Öffnen Sie die Kopie einer lernenden Person und die abgegebene Arbeit, bewerten Sie sie und geben Sie sie mit einer Begründung zur Überarbeitung zurück, wenn mehr nötig ist.

Dieses Lab ausprobieren, und was es kostet

Mit einem kostenlosen persönlichen Konto können Sie die Grundlagenlektionen in diesem Lab durcharbeiten, mit genug kostenlosem Guthaben pro Monat für die meisten Lektionen und ohne Karte. Für eine Klasse sind die ersten 365 Tage für eine Schule kostenlos, für bis zu 50 Lernende; danach zahlt sie je lernender Person und Jahr, alle Labs inklusive und Lehrkräfte kostenlos.

Häufige Fragen

Warum ist der erste Befehl langsam?
Der Compiler muss jedes Mal starten und seine Bibliotheken lesen, was ein paar Sekunden dauert. Eine Datei mit runghc oder einen Ausdruck mit ghc -e auszuführen, tut das jedes Mal. Für viele Versuche hintereinander nutzen Sie den interaktiven Prompt ghci, der nur einmal startet.
Warum bleiben Namen und Meldungen auf einer Seite in einer anderen Sprache Englisch?
Die Begrüßung in den Dateien, die Wörter Just und Nothing und jede Meldung des Compilers sind Englisch, und das Lab ändert sie nicht. Die Lektion sagt das und erklärt jede Antwort in der Sprache der Seite.
Können Lernende ein Paket installieren?
Nein. Das Lab hat keinen Weg ins Internet, es kann also nichts heruntergeladen werden: Es gibt nur die Bibliotheken, die mit dem Compiler kommen. Alles aus diesen Bibliotheken, etwa Data.Char, lässt sich importieren.