Par souci d'exhaustivité, permettez-moi d'ajouter une approche alternative "laide", qui est cependant plutôt basique.
Rappelons que Maybe a
c'est un type dont les valeurs sont de la forme Nothing
ou Just x
pour certains x :: a
.
Par conséquent, en réinterprétant les valeurs ci-dessus, nous pouvons considérer Maybe a
comme un "type de liste restreinte" où les listes peuvent avoir zéro ou un élément.
Maintenant, (a, Maybe a)
ajoute simplement un élément de plus, c'est donc un "type de liste" où les listes peuvent avoir un ( (x1, Nothing)
) ou deux ( (x1, Just x2)
) éléments.
Par conséquent, Maybe (a, Maybe a)
est un "type de liste" où les listes peuvent avoir zéro ( Nothing
), un ( Just (x1, Nothing)
) ou deux ( (Just (x1, Just x2)
) éléments.
Vous devriez maintenant être en mesure de comprendre comment procéder. Permettez-moi de souligner à nouveau que ce n'est pas une solution pratique à utiliser, mais c'est (IMO) un bel exercice pour le comprendre de toute façon.
En utilisant certaines fonctionnalités avancées de Haskell, nous pouvons généraliser ce qui précède en utilisant une famille de types:
type family List (n :: Nat) (a :: Type) :: Type where
List 0 a = ()
List n a = Maybe (a, List (n-1) a)