Demi kelengkapan, izinkan saya menambahkan pendekatan alternatif "jelek", yang bagaimanapun agak mendasar.
Ingat itu Maybe a
adalah tipe yang nilainya dari bentuk Nothing
atau Just x
untuk beberapa x :: a
.
Oleh karena itu, dengan menafsirkan kembali nilai-nilai di atas, kita dapat menganggapnya Maybe a
sebagai "tipe daftar terbatas" di mana daftar dapat memiliki nol atau satu elemen.
Sekarang, (a, Maybe a)
cukup tambahkan satu elemen lagi, jadi itu adalah "tipe daftar" di mana daftar dapat memiliki satu ( (x1, Nothing)
) atau dua ( (x1, Just x2)
) elemen.
Oleh karena itu, Maybe (a, Maybe a)
adalah "tipe daftar" di mana daftar dapat memiliki elemen nol ( Nothing
), satu ( Just (x1, Nothing)
), atau dua ( (Just (x1, Just x2)
).
Anda sekarang harus dapat memahami bagaimana melanjutkan. Biarkan saya tekankan lagi bahwa ini bukan solusi yang mudah digunakan, tetapi (IMO) latihan yang bagus untuk memahaminya.
Menggunakan beberapa fitur canggih dari Haskell, kita dapat menggeneralisasi di atas menggunakan tipe keluarga:
type family List (n :: Nat) (a :: Type) :: Type where
List 0 a = ()
List n a = Maybe (a, List (n-1) a)