
On Fri, Jul 11, 2008 at 7:07 AM, Ron Alford
What's odd is that it works directly (typeOf ... (Expr (f :+: g)) returns a type), but if you enclose the expression in a list, it fails with Prelude.undefined. Do I also need a custom instance for Typeable [Expr ...] ? (See previous message for code)
The problem is that the List instance is playing the same dirty tricks with it's 'typeOf' implementation as we are: it's asking us the type of one of the list elements by passing in "undefined" to our "typeOf1" implementation. And then your "typeOf1" implementation tries to do pattern matching on undefined. Here is what will work: instance (Typeable1 f, Typeable1 g) => Typeable1 (f :+: g) where typeOf1 x = mkTyConApp (mkTyCon "Planning.Wouter.:+:") [typeOf1 left, typeOf1 right] where (Inr right) = Inr undefined `asTypeOf` x (Inl left) = Inl undefined `asTypeOf` x Now we never do pattern matching on our input. This has been pretty educational. -Antoine