Therefore, to help me understand some of the more advanced functions and concepts of Haskell / GHC, I decided to use a working version of dynamically typed data based on GADT and expand it to cover parametric types. (I apologize for the length of this example.)
{-
Compiling this, however, is not performed on the last line (line numbers do not match this example):
../src/Dyn.hs:105:34: Could not deduce (a2 ~ b) from the context (a1 ~ f a2, a ~ fb) bound by a pattern with constructor Induction :: forall ab (f :: * -> *). Equal ab -> Equal (fa) (fb), in a case alternative at ../src/Dyn.hs:105:13-23 `a2' is a rigid type variable bound by a pattern with constructor Induction :: forall ab (f :: * -> *). Equal ab -> Equal (fa) (fb), in a case alternative at ../src/Dyn.hs:105:13 `b' is a rigid type variable bound by a pattern with constructor Induction :: forall ab (f :: * -> *). Equal ab -> Equal (fa) (fb), in a case alternative at ../src/Dyn.hs:105:13 Expected type: a1 Actual type: a In the first argument of `Just', namely `value' In the expression: Just value In a case alternative: Just (Induction _) -> Just value
The way I read this, the compiler cannot understand that in Inductive :: Equal ab -> Equal (fa) (fb)
, a
and b
must be equal for invalid values. So I tried Inductive :: Equal aa -> Equal (fa) (fa)
, but that also fails, in the definition of matchTypes :: TypeRep a -> TypeRep b -> Maybe (Equal ab)
:
../src/Dyn.hs:66:60: Could not deduce (a2 ~ a1) from the context (a ~ [a1]) bound by a pattern with constructor List :: forall a. TypeRep a -> TypeRep [a], in an equation for `matchTypes' at ../src/Dyn.hs:66:13-18 or from (b ~ [a2]) bound by a pattern with constructor List :: forall a. TypeRep a -> TypeRep [a], in an equation for `matchTypes' at ../src/Dyn.hs:66:22-27 `a2' is a rigid type variable bound by a pattern with constructor List :: forall a. TypeRep a -> TypeRep [a], in an equation for `matchTypes' at ../src/Dyn.hs:66:22 `a1' is a rigid type variable bound by a pattern with constructor List :: forall a. TypeRep a -> TypeRep [a], in an equation for `matchTypes' at ../src/Dyn.hs:66:13 Expected type: TypeRep a1 Actual type: TypeRep a In the second argument of `matchTypes', namely `b' In the second argument of `(<$>)', namely `(matchTypes ab)'
Changing the type of matchTypes :: TypeRep a -> TypeRep b -> Maybe (Equal ab)
to create matchTypes :: TypeRep a -> TypeRep b -> Maybe (Equal aa)
does not work (just read it as a sentence). Also there is no matchTypes :: TypeRep a -> TypeRep a -> Maybe (Equal aa)
(another trivial sentence, and this, as I understand it, will require users fromDynamic' to know the
a in the
TypeRep a contained in the
Dynamic`).
So I'm at a dead end. Any pointers on how to move forward here?