[GHC] #13290: Data constructors should not have RULES

GHC ghc-devs at haskell.org
Fri Feb 17 16:28:54 UTC 2017


#13290: Data constructors should not have RULES
-------------------------------------+-------------------------------------
        Reporter:  simonpj           |                Owner:  dfeuer
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:  8.0.1
      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:                    |
-------------------------------------+-------------------------------------
Description changed by simonpj:

Old description:

> GHC has never (knowingly) supported rules for data constructors, like
> {{{
> {-# RULES
>   "BadBadBad"   Just [x,y] = Just []
>  #-}
> Notice that the rule is for the ''constructor itself''.  Presumably the
> intent is that any occurrence of `Just` appplied to a two-element list
> will rewrite to `Just []`.
>
> But currently they are accidentally allowed through, and then behave in
> mysterious ways because of constructor wrappers.  Duncan Coutts says
> {{{
> > Well I've certainly tried to use that in the past.
> > A previous version of the cbor lib which used a different
> > representation did a lot of matching on constructors to re-arrange
> > input to an interpreter, until I discovered that GHC actually uses
> > constructor wrappers and that matching on constructors was thus not
> > reliable
> }}}
> I think we should simply make it illegal for now. If you really want it,
> use a smart constructor thus
> {{{
> mkJust x = Just x
> {-# INLINE [0] mkJust #-}
> {-# RULES “Good” mkJust [x,y] = mkJust [] #-}
> }}}
> So let us
>
> * Check in that you don't try to write a rule for a data constructor.
> * Document in the user manual

New description:

 GHC has never (knowingly) supported rules for data constructors, like
 {{{
 {-# RULES
   "BadBadBad"   Just [x,y] = Just []
  #-}
 }}}
 Notice that the rule is for the ''constructor itself''.  Presumably the
 intent is that any occurrence of `Just` appplied to a two-element list
 will rewrite to `Just []`.

 But currently they are accidentally allowed through, and then behave in
 mysterious ways because of constructor wrappers.  Duncan Coutts says
 {{{
 > Well I've certainly tried to use that in the past.
 > A previous version of the cbor lib which used a different
 > representation did a lot of matching on constructors to re-arrange
 > input to an interpreter, until I discovered that GHC actually uses
 > constructor wrappers and that matching on constructors was thus not
 > reliable
 }}}
 I think we should simply make it illegal for now. If you really want it,
 use a smart constructor thus
 {{{
 mkJust x = Just x
 {-# INLINE [0] mkJust #-}
 {-# RULES “Good” mkJust [x,y] = mkJust [] #-}
 }}}
 So let us

 * Check in that you don't try to write a rule for a data constructor.
 * Document in the user manual

--

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


More information about the ghc-tickets mailing list