J'essaie d'utiliser DataKinds pour effectuer une programmation au niveau du type, mais je rencontre des difficultés lorsque l'une de ces structures est imbriquée dans une autre.Programmation de type niveau imbriquée
{-# LANGUAGE DataKinds, TypeFamilies, GADTs, MultiParamTypeClasses, FlexibleInstances #-}
module Temp where
data Prop1 = D | E
data Lower :: Prop1 -> * where
SubThing1 :: Lower D
SubThing2 :: Lower E
class ClassLower a where
somefunc2 :: a -> String
instance ClassLower (Lower D) where
somefunc2 a = "string3"
instance ClassLower (Lower E) where
somefunc2 a = "string4"
data Prop2 = A | B | C
data Upper :: Prop2 -> * where
Thing1 :: Upper A
Thing2 :: Upper B
Thing3 :: Lower a -> Upper C
class ClassUpper a where
somefunc :: a -> String
instance ClassUpper (Upper A) where
somefunc a = "string1"
instance ClassUpper (Upper B) where
somefunc a = "string2"
instance ClassUpper (Upper C) where
somefunc (Thing3 x) = somefunc2 x
Dès que j'ajoute que la dernière instance de ClassUpper, je me retrouve avec une erreur.
Temp.hs:37:25: error:
• Could not deduce (ClassLower (Lower a))
arising from a use of ‘somefunc2’
from the context: 'C ~ 'C
bound by a pattern with constructor:
Thing3 :: forall (a :: Prop1). Lower a -> Upper 'C,
in an equation for ‘somefunc’
at /Users/jdouglas/jeff/emulator/src/Temp.hs:37:13-20
• In the expression: somefunc2 x
In an equation for ‘somefunc’: somefunc (Thing3 x) = somefunc2 x
In the instance declaration for ‘ClassUpper (Upper 'C)’
Je comprends que 'C ~ 'C
indique le type d'égalité, mais je ne comprends pas ce que le problème sous-jacent est, beaucoup moins la solution ou solution de contournement. Qu'est-ce que je ne comprends pas, et quel est le meilleur moyen de résoudre ce problème?
droit, et vous pourriez aussi bien se débarrasser de toutes les classes de types aussi bien. –