Vordefinierte Funktionen
Daten mit Funktionen verarbeiten
In den letzten Abschnitten hast du bereits mehrfach vordefinierte Funktionen benutzt, um Daten (hier: Zahlen) zu verarbeiten.
So kann man die vordefinierte Funktion round
benutzen, um eine Gleitkommazahl zu runden.
> round 3.5
4 : Int
In den weiteren Kapitel wirst du sehen, dass in Elm Datentypen bei Funktionen eine ganz zentrale Rolle spielen.
Das sieht man bereits bei der Verwendung der Funktion round
: Diese Funktion erzeugt aus einer Float
-Zahl (wie z.B. 3.5
)
eine gerundete Int
-Zahl (hier 4
).
Typangaben erzeugen
Funktionen verarbeiten jeweils Daten eines bestimmten Datentyps und liefern als Ergebnisse Daten eines bestimmten Datentyps zurück. In der REPL erhält man die entsprechenden Datentyp-Informationen, wenn man nur den Funktionsnamen auswerten lässt. Eine Datentypangabe zu einer Funktion bezeichnet man auch als Signatur einer Funktion. Wir werden das in den weiteren Kapiteln noch genauer betrachten.
> toFloat
<function> : Int -> Float
> round
<function> : Float -> Int
> floor
<function> : Float -> Int
> ceiling
<function> : Float -> Int
Eine Datentypangabe zu einer Funktion bezeichnet man auch als Signatur einer Funktion. Wir werden das in den weiteren Kapiteln noch genauer betrachten.
Aufgabe 1
Deute die Typangaben im oben gezeigten REPL-Dialog.
Rechenoperationen als Funktionen deuten
Die vordefinierten Rechenoperationen sind ebenfalls Funktionen. Das sieht man, wenn man die in Elm auch mögliche alternative Schreibweise für Rechenausdrücke betrachtet. Das Rechenzeichen wird - mit einer Klammer versehen - vor die zu verarbeitenden Zahlen geschrieben.
> (+) 2 4
6 : number
> (-) 2 4
-2 : number
> (*) 2 4
8 : number
> (//) 2 4
0 : Int
> (/) 2 4
0.5 : Float
Die Schreibweise mit dem Rechenzeichen vorneweg (wie bei (+) 2 4
) nennt man Präfix-Schreibweise.
Die Alltagsschreibweise mit dem Rechenzeichen in der Mitte (wie bei 2 + 4
) nennt man Infix-Schreibweise.
Die Präfix-Schreibweise kann man benutzen, um die Typangaben (bzw. Signaturen) der betreffenden Rechenoperationen (als Funktionen) zu bestimmen.
> (+)
<function> : number -> number -> number
> (-)
<function> : number -> number -> number
> (*)
<function> : number -> number -> number
> (/)
<function> : Float -> Float -> Float
> (//)
<function> : Int -> Int -> Int
Die von Elm benutzten Typangaben bei Funktionen mit mehreren Übergabedaten ist gewöhnungsbedürfig (hat aber einen fachlichen Hintergrund, den wir an späterer Stelle erklären). Man könnte die Typangaben auch so schreiben:
(+) : number number -> number
(-) : number number -> number
(*) : number number -> number
(/) : Float Float -> Float
(//) : Int Int -> Int
Aufgabe 2
Deute die Typangaben - insbesondere zu den beiden Divisionsfunktionen. Ergänze hierzu die folgenden Sätze:
"Der Divisionsoperator /
ist eine Funktion mit folgenden Verhalten. Wenn man zwei Float
-Zahlen übergibt,
dann gibt sie ... zurück."
"Der Divisionsoperator //
ist eine Funktion mit folgenden Verhalten. ..."
Aufgabe 3
Wenn bei der Verwendung einer Funktion die Typvorgaben nicht beachtet werden, dann gibt es eine Fehlermeldung. Das hast du in den Beispielen in den vorangegangenen Abschnitten bereits gesehen. Welche der folgenden Rechnungen ergeben eine Fehlermeldung? Stelle zunächst Vermutungen auf und überprüfe sie anschließend in der REPL.
> 2 + 3.0
...
> 2 / 3
...
> 6.0 // 2
...
> -2 // 2
...
> (5 // 2) * (5 // 2)
...
> (5 // 2) / (5 // 2)
...
> (5 / 2) * (5 / 2)
...
> (5 / 2) // (5 / 2)
...