¿Cuál es la extensión DataKinds de Haskell?
data-kinds (2)
Aquí está mi opinión:
Considere una longitud indexada Vector de tipo:
data Vec n a where
Vnil :: Vec Zero a
Vcons :: a -> Vec n a -> Vec (Succ n) a
data Zero
data Succ a
Aquí tenemos un Kind Vec :: * -> * -> *
. Ya que puedes representar un Vector de Int de longitud cero por:
Vect Zero Int
También puedes declarar tipos sin sentido decir:
Vect Bool Int
Esto significa que podemos tener programación funcional sin tipo en el nivel de tipo. Por lo tanto, nos deshacemos de dicha ambigüedad mediante la introducción de tipos de datos y podemos tener ese tipo:
Vec :: Nat -> * -> *
Así que ahora nuestro Vec
obtiene un DataKind llamado Nat
que podemos declarar como:
datakind Nat = Zero | Succ Nat
Al introducir un nuevo tipo de datos, nadie puede declarar un tipo sin sentido ya que ahora Vec
tiene una firma tipo más restringida.
Estoy tratando de encontrar una explicación de la extensión DataKinds que tenga sentido para mí, ya que solo he leído Learn You a Haskell . ¿Hay alguna fuente estándar que tenga sentido para mí con lo poco que he aprendido?
Editar: por ejemplo, la documentation dice
Con -XDataKinds, GHC automáticamente promueve que cada tipo de datos adecuado sea un tipo, y sus (valor) constructores sean constructores de tipo. Los siguientes tipos
y da el ejemplo
data Nat = Ze | Su Nat
dar lugar a los siguientes tipos y tipos de constructores:
Nat :: BOX
Ze :: Nat
Su :: Nat -> Nat
No entiendo el punto. Aunque no entiendo qué significa BOX
, las declaraciones Ze :: Nat
y Su :: Nat -> Nat
parecen indicar lo que normalmente es el caso de que Ze y Su sean constructores de datos normales exactamente como esperarías ver con ghci
Prelude> :t Su
Su :: Nat -> Nat
Bueno, comencemos con los conceptos básicos
Tipos
Tipos son los tipos de tipos *, por ejemplo
Int :: *
Bool :: *
Maybe :: * -> *
Observe que ->
está sobrecargado para significar "función" en el nivel amable también. Entonces *
es el tipo de tipo Haskell normal.
Podemos pedirle a GHCi que imprima el tipo de algo con :k
.
Tipos de datos
¡Ahora esto no es muy útil, ya que no tenemos forma de hacer nuestros propios tipos! Con DataKinds
, cuando escribimos
data Nat = S Nat | Z
GHC promoverá esto para crear el tipo correspondiente Nat
y
S :: Nat -> Nat
Z :: Nat
Entonces DataKind
s hace que el amable sistema sea extensible.
Usos
Hagamos el ejemplo de tipos prototípicos usando GADT
data Vec :: Nat -> * where
Nil :: Vec Z
Cons :: Int -> Vec n -> Vec (S n)
Ahora vemos que nuestro tipo de Vec
está indexado por longitud.
Esa es la descripción básica de 10k pies.
** Esto realmente continúa, Values : Types : Kinds : Sorts ...
Algunos idiomas (Coq, Agda ...) admiten esta pila infinita de universos, pero Haskell agrupa todo en un solo género.