4. Listen
Erinnern Sie sich an den Typ Folge
aus dem
letzten Kapitel:
type Folge a
= Leer
| Paar a (Folge a)
Den gibt es in Elm bereits, und zwar unter dem
Namen List a
, mit Typenvariable a
.
Die Syntax enthält ein großes Maß an Syntaxzucker, um uns
als Programmierern die Arbeit mit Listen zu vereinfachen.
Ich stelle hier die Folge
-Syntax und die
eingebaute / vorgefertigte List
-Syntax gegenüber:
x = Leer
Paar 2 x
Paar 2 (Paar 3 (Paar 9 Leer))
x = []
2 :: x
2 :: (3 :: (9 :: [])) -- oder auch:
2 :: 3 :: 9 :: [] -- oder ganz einfach:
[2, 3, 9]
Also: statt dem Konstruktor Leer
gibt es
das Symbol []
. Statt
Paar x rest
gibt es x :: rest
.
Beachten Sie hier die für uns gewohntere Infixschreibweise
mit dem ::
zwischen den Operatoren. Schlussendlich
gibt es einfach die Schreibweise [3, 5, 8, 9]
,
um Listen explizit zu konstruieren.
Alle Elemente müssen den gleichen Typ haben
In einer List a
müssen alle Elemente den gleichen
Datentyp a
haben, ganz genau wie in unserer
Folge
.
x : Int
x = 2
[x, 4, 8, 16]
[2, 4, 8, 16] : List Int
["Montag", "Dienstag", "Mittwoch"]
["Montag", "Dienstag", "Mittwoch"] : List String
[Nothing, Just x, Nothing, Nothing, Just 3]
[Nothing,Just 2,Nothing,Nothing,Just 3] : List (Maybe Int)
[[1], [x,3], [4,5,6,7]]
[[1],[2,3],[4,5,6,7]]
Natürlich dürfen Sie Listen von Listen anlegen. Die einzelnen "Mitgliedslisten" dürfen auch unterschiedlich lang sein. Allerdings muss die "Verschachtelungstiefe" gleich sein, denn der Typ aller Elemente muss übereinstimmen. Folgendes geht also nicht:
[ [x,3], [4,5,6], [[7,8], [9,2]], [2,3]]
Denn Elemente 1, 2 und 4 sind vom Type List Int
,
das dritte jedoch vom Typ List (List Int)
.
Die Fehlermeldung kommt prompt:
The 3rd element of this list does not match all the previous elements:
6| [ [x,3], [4,5,6], [[7,8], [9,2]], [2,3]]
^^^^^^^^^^^^^^
The 3rd element is a list of type:
List (List number)
But all the previous elements in the list are:
List Int
List Int
, List String
und so weiter