Per completezza, vorrei aggiungere un approccio "brutto" alternativo, che è comunque piuttosto basilare.
Ricordiamo che Maybe a
è un tipo i cui valori sono del modulo Nothing
o Just x
per alcuni x :: a
.
Quindi, reinterpretando i valori sopra, possiamo considerare Maybe a
un "tipo di elenco limitato" in cui gli elenchi possono avere zero o un elemento.
Ora (a, Maybe a)
aggiunge semplicemente un altro elemento, quindi è un "tipo di elenco" in cui gli elenchi possono avere uno ( (x1, Nothing)
) o due ( (x1, Just x2)
) elementi.
Pertanto, Maybe (a, Maybe a)
è un "tipo di elenco" in cui gli elenchi possono avere zero ( Nothing
), uno ( Just (x1, Nothing)
) o due ( (Just (x1, Just x2)
) elementi.
Ora dovresti essere in grado di capire come procedere. Vorrei sottolineare ancora una volta che questa non è una soluzione conveniente da usare, ma è (IMO) un buon esercizio per capirlo comunque.
Utilizzando alcune funzionalità avanzate di Haskell, possiamo generalizzare quanto sopra usando una famiglia di tipi:
type family List (n :: Nat) (a :: Type) :: Type where
List 0 a = ()
List n a = Maybe (a, List (n-1) a)