Elimination of absurd patterns

C Rodrigues red5_2 at hotmail.com
Mon May 2 23:20:05 CEST 2011

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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/glasgow-haskell-users/attachments/20110502/d0899499/attachment.htm>

More information about the Glasgow-haskell-users mailing list