En aras de la exhaustividad, permítanme agregar un enfoque alternativo "feo", que sin embargo es bastante básico.
Recordemos que Maybe aes un tipo cuyos valores son de la forma Nothingo Just xpara algunos x :: a.
Por lo tanto, al reinterpretar los valores anteriores, podemos considerar Maybe acomo un "tipo de lista restringida" donde las listas pueden tener cero o un elemento.
Ahora, (a, Maybe a)simplemente agrega un elemento más, por lo que es un "tipo de lista" donde las listas pueden tener uno ( (x1, Nothing)) o dos ( (x1, Just x2)) elementos.
Por lo tanto, Maybe (a, Maybe a)es un "tipo de lista" donde las listas pueden tener elementos cero ( Nothing), uno ( Just (x1, Nothing)) o dos ( (Just (x1, Just x2)).
Ahora debería poder entender cómo proceder. Permítanme enfatizar nuevamente que esta no es una solución conveniente para usar, pero es (IMO) un buen ejercicio para entenderlo de todos modos.
Usando algunas características avanzadas de Haskell, podemos generalizar lo anterior usando una familia de tipos:
type family List (n :: Nat) (a :: Type) :: Type where
List 0 a = ()
List n a = Maybe (a, List (n-1) a)