Por lo tanto, finalmente encontré una tarea donde podría hacer uso de la nueva extensión DataKinds
(usando ghc 7.4.1). Aquí está el Vec
que estoy usando:Nombre de enlace en tipo de firma usando 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
Ahora, por conveniencia que quería poner en práctica fromList
. Básicamente no hay problema con la recursión/plegado simple, pero no puedo encontrar la forma de darle el tipo correcto. A modo de referencia, esta es la versión Agda:
fromList : ∀ {a} {A : Set a} → (xs : List A) → Vec A (List.length xs)
enfoque Mi Haskell, usando la sintaxis vi here:
fromList :: (ls :: [a]) -> Vec (length ls) a
fromList [] = Nil
fromList (x:xs) = Cons x (fromList xs)
Esto me da una parse error on input 'a'
. ¿La sintaxis que encontré es incluso correcta, o la han cambiado? También agregué algunas extensiones más que están en el código en el enlace, que tampoco ayudó (actualmente tengo GADTs, DataKinds, KindSignatures, TypeOperators, TypeFamilies, UndecidableInstances
).
Mi otra sospecha era que yo no puedo obligar tipos polimórficos, pero mi prueba para esto:
bla :: (n :: Nat) -> a -> Vec (S n) a
bla = undefined
fallado, también, con Kind mis-match Expected kind 'ArgKind', but 'n' has kind 'Nat'
(no se sabe muy bien lo que significa).
¿Alguien me podría ayudar con una versión de trabajo de fromList
y también aclarar los otros problemas? Desafortunadamente, DataKinds
aún no está bien documentado y parece suponer que todos los que lo utilizan tienen un profundo conocimiento de la teoría de tipos.
Wow, muchas gracias. Esto me hace comenzar a entender realmente 'DataKinds' - me engañan un poco, parece. De hecho, al principio, pensé que necesitaría la versión cuantificada existencialmente, pero el tipo dependiente se parecía mucho más a lo que realmente quería que expresara el tipo. Aún así, ¿de dónde viene la sintaxis de enlace con '(a :: X) -> Y'? Lo he visto en algunos lugares ahora. – phg
Por ejemplo, se usa [aquí] (http://haskell.1045720.n5.nabble.com/Data-Kinds-and-superfluous-in-my-opinion-constraints-contexts-td5689436.html), y yo piense también [aquí] (http://www.typesandotherdistractions.com/2012/02/fun-with-xpolykinds-polykinded-folds.html). – phg
Creo que la mayor parte de lo que tiene es código en el término nivel '\ (a :: X) -> y' y/o cosas que involucran' PolyKinds'. Por ejemplo: 'data Box a = Box' y' bla :: Box (n :: Nat) -> a -> Vec n a' –