Để hoàn thiện, hãy để tôi thêm một cách tiếp cận thay thế "xấu xí", tuy nhiên khá cơ bản.
Nhớ lại rằng đó Maybe a
là một loại có giá trị của mẫu Nothing
hoặc Just x
cho một số x :: a
.
Do đó, bằng cách diễn giải lại các giá trị ở trên, chúng ta có thể coi Maybe a
là "loại danh sách bị hạn chế" trong đó danh sách có thể có 0 hoặc một phần tử.
Bây giờ, (a, Maybe a)
chỉ cần thêm một phần tử nữa, vì vậy nó là "loại danh sách" trong đó danh sách có thể có một ( (x1, Nothing)
) hoặc hai ( (x1, Just x2)
) phần tử.
Do đó, Maybe (a, Maybe a)
là "loại danh sách" trong đó danh sách có thể có các phần tử zero ( Nothing
), one ( Just (x1, Nothing)
) hoặc hai ( (Just (x1, Just x2)
).
Bây giờ bạn có thể hiểu làm thế nào để tiến hành. Hãy để tôi nhấn mạnh một lần nữa rằng đây không phải là một giải pháp thuận tiện để sử dụng, nhưng nó (IMO) là một bài tập tốt để hiểu về nó.
Sử dụng một số tính năng nâng cao của Haskell, chúng tôi có thể khái quát hóa những điều trên bằng cách sử dụng một loại họ:
type family List (n :: Nat) (a :: Type) :: Type where
List 0 a = ()
List n a = Maybe (a, List (n-1) a)