Tamlık uğruna, "çirkin" bir alternatif yaklaşım eklememe izin verin, ancak bu oldukça basittir.
Maybe a
Değerleri formda olan Nothing
veya Just x
bazıları için olan bir tür olduğunu hatırlayın x :: a
.
Bu nedenle, yukarıdaki değerleri yeniden yorumlayarak, Maybe a
listelerin sıfır veya bir öğeye sahip olabileceği bir "kısıtlı liste türü" olarak değerlendirebiliriz.
Şimdi, (a, Maybe a)
bir öğe daha eklediğinden listelerin bir ( (x1, Nothing)
) veya iki ( (x1, Just x2)
) öğeye sahip olabileceği bir "liste türü" dir .
Bu nedenle, Maybe (a, Maybe a)
listelerin sıfır ( Nothing
), bir ( Just (x1, Nothing)
) veya iki ( (Just (x1, Just x2)
) öğeye sahip olabileceği bir "liste türü" dür.
Şimdi nasıl ilerleyeceğinizi anlayabilmelisiniz. Bunun kullanımı için uygun bir çözüm olmadığını tekrar vurgulayayım, ama yine de anlamak için güzel bir egzersiz (IMO).
Haskell'in bazı gelişmiş özelliklerini kullanarak, yukarıdakileri bir tür aile kullanarak genelleştirebiliriz:
type family List (n :: Nat) (a :: Type) :: Type where
List 0 a = ()
List n a = Maybe (a, List (n-1) a)