J'ai appris à propos de la programmation au niveau du type et je voulais écrire une simple fonction de type addition naturelle. Ma première version qui fonctionne est la suivante:Jouer avec des DataKinds - Erreurs de mauvais appariement
data Z
data S n
type One = S Z
type Two = S (S Z)
type family Plus m n :: *
type instance Plus Z n = n
type instance Plus (S m) n = S (Plus m n)
Donc GHCi je peux faire:
ghci> :t undefined :: Plus One Two
undefined :: Plus One Two :: S * (S * (S * Z))
qui fonctionne comme prévu. Je me suis alors décidé d'essayer l'extension DataKinds en modifiant les Z
et S
types à:
data Nat = Z | S Nat
Et la famille plus retourne maintenant un Nat
genre:
type family Plus m n :: Nat
Le code modifié compile mais le problème est J'obtiens maintenant une erreur en la testant:
Kind mis-match
Expected kind `OpenKind', but `Plus One Two' has kind `Nat'
In an expression type signature: Plus One Two
In the expression: undefined :: Plus One Two
J'ai cherché une solution mais Google m'a échoué . Est-ce qu'une solution existe ou ai-je atteint une limite de la langue?
utilisation ': kind! Plus One Two' en ghci. – Satvik
Je pense que dans 'undefined :: SomeType',' SomeType' doit être de type '*' seulement. – Satvik
Si vous voulez vraiment transporter un témoin de type à l'exécution, vous pouvez utiliser le standard ['Proxy' trick] (http://hackage.haskell.org/packages/archive/tagged/0.4.4/doc/html/ Data-Proxy.html). –