所以,我终于找到了一个可以利用新功能的任务DataKinds
扩展(使用 ghc 7.4.1)。这是Vec
我在用着:
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 http://haskell.1045720.n5.nabble.com/Data-Kinds-and-superfluous-in-my-opinion-constraints-contexts-td5689436.html:
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
尚未得到很好的记录,并且似乎假设每个使用它的人都具有深厚的类型理论知识。