Итак, я, наконец, нашел задачу, где я мог бы использовать расширение DataKinds
(используя ghc 7.4.1). Вот Vec
я использую:Связывание имени в сигнатуре типа с использованием DataKind
data Nat = Z | S Nat deriving (Eq, Show)
data Vec :: Nat -> * -> * where
Nil :: Vec Z a
Cons :: a -> Vec n a -> Vec (S n) a
Теперь, для удобства я хотел реализовать fromList
. В принципе нет проблем с простой рекурсией/сгибом - но я не могу понять, как дать ему правильный тип. Для справки, это версия Agda:
fromList : ∀ {a} {A : Set a} → (xs : List A) → Vec A (List.length xs)
Мой Haskell подход, используя синтаксис я видел here:
fromList :: (ls :: [a]) -> Vec (length ls) a
fromList [] = Nil
fromList (x:xs) = Cons x (fromList xs)
Это дает мне parse error on input 'a'
. Является ли синтаксис, который я нашел, даже правильно, или они изменили его? Я также добавил несколько расширений, которые находятся в коде в ссылке, что тоже не помогло (в настоящее время у меня есть GADTs, DataKinds, KindSignatures, TypeOperators, TypeFamilies, UndecidableInstances
).
Моя другая подозрение в том, что я просто не могу связать полиморфные типы, но мой тест для этого:
bla :: (n :: Nat) -> a -> Vec (S n) a
bla = undefined
не удалось, тоже с Kind mis-match Expected kind 'ArgKind', but 'n' has kind 'Nat'
(на самом деле не знаю, что это значит).
Может ли кто-нибудь помочь мне с рабочей версией fromList
, а также прояснить другие вопросы? К сожалению, DataKinds
еще не задокументирован очень хорошо, и, похоже, предполагается, что все, кто использует его, обладают глубокими знаниями теории типов.
Ничего себе, спасибо большое. Это заставляет меня начать понимать «DataKinds» - кажется, они вводят меня в заблуждение. Действительно, вначале я думал, что мне понадобится экзистенциально квантифицированная версия, но зависимый тип больше похож на то, что я действительно хотел, чтобы этот тип выражал. Тем не менее, откуда берется синтаксис привязки с '(a :: X) -> Y'? Я уже видел это в некоторых местах. – phg
Например, он используется [здесь] (http://haskell.1045720.n5.nabble.com/Data-Kinds-and-superfluous-in-my-opinion-constraints-contexts-td5689436.html), и я думаю также [здесь] (http://www.typesandotherdistractions.com/2012/02/fun-with-xpolykinds-polykinded-folds.html). – phg
Я думаю, что большинство из того, что у вас есть, это код на уровне уровня '\ (a :: X) -> y' и/или материал, включающий' PolyKinds'. Например: 'data Box a = Box' и' bla :: Box (n :: Nat) -> a -> Vec n a' –