そのため、新しい拡張機能を利用できるタスクを最終的に見つけました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アプローチ:
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
まだ十分に文書化されておらず、それを使用するすべての人が深い型理論の知識を持っていると想定しているようです。