
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

On Mon, May 2, 2011 at 6:20 PM, C Rodrigues
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?
IIRC, GHC 6.12.3 had some problems with type equalities. Did you try GHC 7.0.3? Cheers, =) -- Felipe.

I tried it again using a development version of GHC 7.1 that I downloaded in March. The results are the same, with GHC generating different code for the supposedly equivalent data types. 'barName' has an impossible pattern match against constructor 'BarExtra', whereas 'fooName' does not. ----------------------------------------
Date: Mon, 2 May 2011 23:03:23 -0300 Subject: Re: Elimination of absurd patterns From: felipe.lessa@gmail.com To: red5_2@hotmail.com CC: glasgow-haskell-users@haskell.org
On Mon, May 2, 2011 at 6:20 PM, C Rodrigues wrote:
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?
IIRC, GHC 6.12.3 had some problems with type equalities. Did you try GHC 7.0.3?
Cheers, =)
-- Felipe.
participants (2)
-
C Rodrigues
-
Felipe Almeida Lessa