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
Einführende Beispiele auf der Konsole. Typenvariablen erwähnen: List Int, List String und so weiter