I'm re-sending this e-mail, hopefully with proper line breaks this time.

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 Tag
data 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 -> String
fooName (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 -> String
barName (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