[GHC] #14826: Flatten data types extending other data types in STG

GHC ghc-devs at haskell.org
Wed Feb 21 14:13:01 UTC 2018


#14826: Flatten data types extending other data types in STG
-------------------------------------+-------------------------------------
        Reporter:  nomeata           |                Owner:  (none)
            Type:  feature request   |               Status:  new
        Priority:  low               |            Milestone:
       Component:  Compiler          |              Version:  8.5
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by nomeata):

 >  Note that I am NOT re-using the data constructor for Foo (which would
 be tricky and confusing).

 Why not? In fact, with your desguaring, and #13861, we’d get that:
 {{{
 data Result = Ok_A Int | OK_B Bool | OK_C C | NotOK Error

 f r = join j x = wimwam x True x
       in case r as b  of
          OK_A n  -> jump j b
          OK_B b  -> jump j b
          OK_C    -> jump j b
          NOtOK _ -> 0
 }}}

 >  I wonder if we could leverage pattern synonyms rather than have more
 built-in stuff.

 Yes, your encoding is all doable with pattern synonyms already:
 {{{
 data Foo = A Int | B Bool | C
 -- we want: data Result = Ok !Foo | NotOK Error
 data Result = Ok_A Int | OK_B Bool | OK_C | NotOK Error

 pattern Ok :: Foo -> Result
 pattern Ok f <- ((\case Ok_A i -> Just (A i); OK_B b -> Just (B b); OK_C
 -> Just C; _ ->          Nothing) -> Just f)
   where Ok = \case A i -> Ok_A i; B b -> OK_B b; C -> OK_C
 }}}
 or, if people feel bold (and until #13861 does this automatically)
 {{{
 pattern Ok :: Foo -> Result
 pattern Ok f <- ((\case NotOK _ -> Nothing; foo -> Just (unsafeCoerce
 foo)) -> Just f)
   where Ok = unsafeCoerce
 }}}

 So since this is somewhat nicely possible, it makes sense for people to
 play around with either of these encodings using pattern synonyms, and let
 us know if they notice any gains.

-- 
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/14826#comment:6>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list