Elm - Architektur
Reine Funktionen
Beim Caesar-Projekt hast du gelernt, wie man in Elm erreicht, dass alle Funktionen reine Funktionen bleiben, und das Programm mit Hilfe der Laufzeit-Umgebung trotzdem Seiteneffekte erzeugen kann, also z.B. Informationen auf der Webseite anzeigen kann.
Reinen Funktionen müssen zusätzlich deterministisch sein, d.h. sie müssen bei gleichen Eingabewerten immer das gleiche Ergebnis liefern. Das bedeutet, dass Zufallszahlen nicht direkt in einer reinen Funktion erzeugt werden können.
Eine Erweiterung der Elm-Architektur ermöglicht es dennoch, mit Zufallszahlen zu arbeiten.
The Elm Architecture - TEA
Zuerst wollen wir noch einmal die bisherige Architektur unserer Elm-Programme betrachten. Hier siehst du noch einmal eine schematische Darstellung der Elm-Architektur, die auch als TEA (The Elm Architecture) bezeichnet wird. Wir gehen in der Abbildung davon aus, dass wir einen Datentyp bzw. ein Typ-Alias für Msg und Model definiert haben.
Das folgende Elm-Programm lässt einige empfehlenswerte Bestandteile wie z.B. die Definition eines Message-Typs oder die Definition eines Typ-Alias für das Datenmodell außer Acht, um möglichst kompakt zu sein:
module Main exposing (main)
import Browser
import Html exposing (..)
import Html.Events exposing (..)
main =
Browser.sandbox
{ init = "Hallo"
, view =
\model ->
div []
[ button [ onClick "Los" ] [ text "Neuer Text" ]
, text model
]
, update = \msg model -> "Ich hatte ein Update"
}
Aufgabe
(a) Beschreibe die Funktionsweise des Programms.
Gehe dabei auf TEA ein und erkläre, welche Rolle init,
view und update spielen.
Du kannst die Wirkung des Programms hier testen.
(b) Stelle den Prozess in einem Rollenspiel dar.
Eine Person spielt die Rolle der Laufzeit-Umgebung,
eine Person stellt das initiale Datenmodell bereit,
je eine Person spielt die view- und die update-Funktion.
Nutze Papierzettel, um die Datenmodelle, Nachrichten, abstrakte Html-Darstellung
und die Webseite zu visualisieren.
Verdeutliche auch im Rollenspiel, wie die Funktionen rein funktional bleiben und
dennoch Seiteneffekte erzeugt werden können.