Lassen Sie mich der Vollständigkeit halber einen "hässlichen" alternativen Ansatz hinzufügen, der jedoch eher grundlegend ist.
Denken Sie daran, dass dies Maybe a
ein Typ ist, dessen Werte von der Form Nothing
oder Just x
für einige sind x :: a
.
Daher können wir durch Neuinterpretation der obigen Werte Maybe a
einen "eingeschränkten Listentyp" betrachten, bei dem Listen entweder null oder ein Element haben können.
Fügen Sie jetzt (a, Maybe a)
einfach ein weiteres Element hinzu, sodass es sich um einen "Listentyp" handelt, bei dem Listen ein ( (x1, Nothing)
) oder zwei ( (x1, Just x2)
) Elemente enthalten können.
Daher Maybe (a, Maybe a)
handelt es sich um einen "Listentyp", bei dem Listen null ( Nothing
), eins ( Just (x1, Nothing)
) oder zwei ( (Just (x1, Just x2)
) Elemente enthalten können.
Sie sollten jetzt verstehen können, wie Sie vorgehen müssen. Lassen Sie mich noch einmal betonen, dass dies keine bequeme Lösung ist, aber es ist (IMO) eine schöne Übung, sie trotzdem zu verstehen.
Mit einigen erweiterten Funktionen von Haskell können wir das Obige mithilfe einer Typfamilie verallgemeinern:
type family List (n :: Nat) (a :: Type) :: Type where
List 0 a = ()
List n a = Maybe (a, List (n-1) a)