[Haskell-cafe] Unexpected Typeable behaviour; Prelude.undefined

Philip Holzenspies pkfh at st-andrews.ac.uk
Mon Aug 29 00:44:45 CEST 2011


L.S.,

I'm currently writing code where I want some ADTs to be parametric with a monad. There are some extra conditions that I place on my parameter, but I've boiled things down to minimal reproducibility. When I define MyADT as follows:


import Data.Typeable

data MyADT m = MyADT (m ())

instance (Typeable1 m, Monad m) => Typeable (MyADT m) where
	typeOf t@(MyADT _)
	 = mkTyCon "MyADT"
	  `mkTyConApp`
	  [typeOf1 ((return :: Monad m => MyADT m -> m (MyADT m)) t)]


it compiles fine and GHCi works as expected on a single instance of MyADT:


*Main> typeOf (MyADT (return () :: IO ()))
MyADT IO


However, as soon as I place my data type in a structure of sorts, things break down:


*Main> typeOf [(MyADT (return () :: IO ()))]
*** Exception: Prelude.undefined
*Main> typeOf (Just (MyADT (return () :: IO ())))
*** Exception: Prelude.undefined
*Main> typeOf ((return :: a -> IO a) (MyADT (return () :: IO ())))
*** Exception: Prelude.undefined


But if I stick a number in a similar structure, typeOf works just fine:


*Main> typeOf ((return :: a -> IO a) 5)
IO Integer


I don't quite understand where  the undefined comes from. I'm certainly not using it anywhere (as shown by the minimal reproduction above). Weirder still, when I *do* introduce a nice error, that too does not come up, viz.


import Data.Typeable

data MyADT m = MyADT (m ())
instance (Typeable1 m, Monad m) => Typeable (MyADT m) where
	typeOf t@(MyADT _)
	 = error "foobar"


with GHCi-session:


*Main> typeOf (MyADT (return () :: IO ()))
*** Exception: foobar
*Main> typeOf ((return :: a -> IO a) (MyADT (return () :: IO ())))
*** Exception: Prelude.undefined
*Main> typeOf $ Just (MyADT (return () :: IO ()))
*** Exception: Prelude.undefined
*Main> typeOf $ Just 42
Maybe Integer


FYI, I'm using GHC 7.0.3, as installed with the Haskell Platform 2011.2.0.1. Am I overlooking something? Any help would be appreciated.

Regards,
Philip


More information about the Haskell-Cafe mailing list