Fachkonzept - Fehlerbehandlung mit Maybe
Erfolgreiche oder fehlgeschlagene Berechnungen
Die Programmiersprache Elm ist so konzipiert, dass nahezu keine Laufzeitfehler
auftreten können. Das ist ein großes Plus dieser Programmiersprache.
Elm erreicht das mit Hilfe des Typsystems.
Zur Charakterisierung potentiell unsicherer Operationen nutzt man geeignete Datentypen
und behandelt Fehler als Daten.
Wie das funktioniert wird im Folgenden am Datentyp Maybe verdeutlicht.
Der Datentyp Maybe
Der Datentyp Maybe ist so definiert:
type Maybe a
= Just a
| Nothing
Die Typvariable a kann dabei mit einem beliebigen vordefinierten Typ oder
einem selbst definierten Typ konkretisiert werden.
Beispiel: Maybe Int
Die Typdefinition von Maybe besagt, dass es genau zwei Sorten von
Daten vom Datentyp Maybe Int gibt:
Zum einen Daten wie Just 2 oder Just -4, die besagen,
dass genau die betreffende Int-Zahl gemeint ist.
Zum anderen gibt es den Datenwert Nothing, der besagt,
dass es sich um nichts dergleichen (hier: um keine Int-Zahl) handelt.
Der Datentyp Maybe wird des öfteren bei gängigen vordefinierten
Funktionen benutzt.
Beispiel: Zahlumwandlung mit String.toInt
> String.toInt
<function> : String -> Maybe Int
> String.toInt "2"
Just 2 : Maybe Int
> String.toInt "hi"
Nothing : Maybe Int
Immer, wenn eine Umwandlung einer Zeichenkette in eine Zahl schiefläuft, wird der Datenwert Nothing zurückgegeben.
Beispiel: Listenzugriff mit List.head und List.tail
> List.head
<function> : List a -> Maybe a
> List.head [1,2,3]
Just 1 : Maybe number
> List.head []
Nothing : Maybe a
Bei einer leeren Liste ist kein Zugriff möglich. Dann wird der Datenwert Nothing zurückgegeben.
Die Beispiele verdeutlichen, dass in Fehlersituationen ein Fehler-Datenwert zurückgeliefert wird, der dann weiterverarbeitet werden kann. Es tritt dadurch kein Laufzeitfehler auf.
Verarbeitung von Maybe-Daten
Eine Verarbeitung von Maybe-Daten wird häufig mit einem case-Ausdruck beschrieben.
stringToInt : String -> Int
stringToInt zeichenkette =
let
maybezahl =
String.toInt zeichenkette
in
case maybezahl of
Just x ->
x
Nothing ->
0
Hier wird im Nothing-Fall ein selbst gewählter Defaultwert zurückgegeben.
Eine Verarbeitung von Maybe-Daten ist auch mit der vordefinierten Funktion withDefault möglich.
stringToInt: String -> Int
stringToInt zeichenkette = Maybe.withDefault 0 (String.toInt zeichenkette)
Hier wird der selbst gewählte Defaultwert innerhalb der Funktion withDefault gesetzt.
In beiden Implementierungen liefert die selbst Funktion stringToInt keine Laufzeitfehler,
da sie für alle möglichen Übergabewerte vom Typ String einen Rückgabewert vom Typ Int erzeugt.