Изучая синглтоны и (полу) зависимую типизацию, я начал пытаться составить список размеров из обычного списка на Haskell с размерами, заданными Натсом, такими как 0, 1, 2, 3, ... вместо Z, SZ , S (SZ) и т. Д. Я использую библиотеку Data.Singletons.TypeLits, кстати. (одиночки-2.5.1).
Вот как я пытался это сделать:
data NatList (a :: *) (n :: Nat) where
Nah :: NatList a 0
Yea :: a -> NatList a n -> NatList a (n + 1)
fromList :: SNat n -> [a] -> NatList a n
fromList s [] = Nah
fromList s (x:xs) = Yea x (fromList (s %- (SNat :: SNat 1)) xs)
Этот код не компилируется и выдает ошибку
"Невозможно сопоставить тип" n "с" 0 "
‘N’ - это переменная жесткого типа, связанная
подпись типа для:
fromList :: forall (n :: Nat) a. SNat n -> [a] -> NatList a n