Commands
Kommandos an die Laufzeitumgebung
Das Programm auf der vorigen Seite ist fast vollständig.
Es fehlt - bis auf die Imports - nur die Definition von wuerfelKommando.
Ein Command ist eine Anweisung, die von der Laufzeitumgebung ausgeführt wird.
In unserem Fall soll wuerfelKommando eine Anweisung sein,
die der Laufzeitumgebung sagt, dass sie eine Zufallszahl zwischen 1 und 6 erzeugen
soll und uns dann eine Nachricht mit der neuen Zahl schicken soll, z.B.
NeueZahl 3.
Das Command ist noch keine Durchführung der Anweisung,
sondern nur die Beschreibung der Anweisung, die von der Laufzeitumgebung
ausgeführt werden soll.
Konkret sieht das Command so aus:
wuerfelKommando : Cmd Msg
wuerfelKommando =
Random.generate NeueZahl (Random.int 1 6)
Random.generate ist eine Funktion, die ein Command erzeugt.
Sie nimmt als erstes Argument eine Funktion, die die generierte Zufallszahl
in eine Nachricht umwandelt, und als zweites Argument einen Generator für
Zufallszahlen, der hier mit Random.int 1 6 erzeugt wird.
Aufgabe 1
Stelle Vermutungen zur Signatur von Random.generate,
NeueZahl und Random.int an.
Überprüfe deine Vermutungen, indem du die Signaturen der Funktionen in der
Dokumentation nachschaust.
(Du musst dazu in der Dokumentation nach Random suchen.)
Aufgabe 2
Teste das vollständige Programm.
Da das Paket elm/random standardmäßig nicht installiert ist,
musst du es zuerst installieren, bevor das Modul Random
importiert werden kann.
Wenn du lokal am Computer arbeitest, musst du dazu in der Kommandozeile den Befehl
elm install elm/random eingeben.
Wenn du ellie-app.com verwendest,
musst du links auf das Paket-Symbol klicken und dort nach elm/random
suchen und kannst es dann mit einem Klick installieren.
Hier siehst du das vollständige Programm:
module Main exposing (main)
import Browser
import Html exposing (..)
import Html.Events exposing (..)
import Random
type alias Model =
{ zahl : Int }
type Msg
= NeueZahl Int
| ButtonKlick
wuerfelKommando : Cmd Msg
wuerfelKommando =
Random.generate NeueZahl (Random.int 1 6)
init : () -> ( Model, Cmd Msg )
init _ =
( { zahl = 0 }, wuerfelKommando )
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
case msg of
NeueZahl z ->
( { zahl = z }, Cmd.none )
ButtonKlick ->
( model, wuerfelKommando )
view : Model -> Html Msg
view model =
div []
[ text (String.fromInt model.zahl)
, button [ onClick ButtonKlick ] [ text "Neu würfeln" ]
]
subscriptions : model -> Sub Msg
subscriptions _ =
Sub.none
main =
Browser.element
{ init = init
, view = view
, update = update
, subscriptions = subscriptions
}