I was experimenting with using GADTs for subtyping when I found something 
interesting.  Hopefully someone can satisfy my curiosity.
Here are two equivalent GADTs.  My understanding was that GHC would translate 
"Foo" and "Bar" into isomorphic data types.  However, GHC 6.12.3 generates 
better code for 'fooName' than for 'barName'.  In 'fooName', there is no 
pattern match against 'FooExtra'.  In 'barName', there is a pattern match 
against 'BarExtra'.  What makes these data types different?

data Tagdata TagExtra
--------
data Foo a where  Foo :: String -> Foo a  FooExtra :: IORef String -> Foo 
TagExtra
-- The cmm code for fooName does not match against 'FooExtra'fooName :: Foo Tag 
-> StringfooName (Foo s) = s
--------
data Bar a where  Bar :: String -> Bar a  BarExtra :: a ~ TagExtra => IORef 
String -> Bar a
-- The cmm code for barName will try to pattern-match against 'BarExtra'barName 
:: Bar Tag -> StringbarName (Bar s) = s
                                          
_______________________________________________
Glasgow-haskell-users mailing list
Glasgow-haskell-users@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

Reply via email to