Constructor as outermost match in RULE under GHC 8.2.2 & 8.4.3

Conal Elliott conal at conal.net
Fri Aug 3 19:50:31 UTC 2018


I get it. Thanks, Ben!

On Fri, Aug 3, 2018 at 12:48 PM, Ben Gamari <ben at smart-cactus.org> wrote:

> On August 2, 2018 9:25:05 PM EDT, Conal Elliott <conal at conal.net> wrote:
> >GHC 8.2.2 and 8.4.3 dislike the following rules:
> >
> >``` haskell
> >{-# RULES
> >
> >"pair fst snd" forall p. (,) (exl p) (exr p) = p
> >
> >"swap" forall p. (,) (exr p) (exl p) = swap p
> >
> > #-}
> >```
> >
> >Error messages:
> >
> >``` haskell
> >/Users/conal/Haskell/concat/plugin/src/ConCat/Rebox.hs:485:1: warning:
> >    A constructor, (,), appears as outermost match in RULE lhs.
> >    This rule will be ignored.
> >    |
> >485 | "pair fst snd" forall p. (,) (exl p) (exr p) = p
> >    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> >
> >/Users/conal/Haskell/concat/plugin/src/ConCat/Rebox.hs:489:1: warning:
> >    A constructor, (,), appears as outermost match in RULE lhs.
> >    This rule will be ignored.
> >    |
> >489 | "swap" forall p. (,) (exr p) (exl p) = swap p
> >    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> >```
> >
> >GHC 8.0.2 didn't complain about these rules, though I'm unsure whether
> >they
> >worked as desired.
> >
> >Why disallow such rules (with constructors at the head)?
> >
> >-- Conal
>
> While we only started warning about them recently, previously the rules
> almost certainly weren't firing as you expected them to. The trouble is
> that constructors are often replaced with their wrappers rather early in
> simplification. This meant that matching on constructors in rules was quite
> unreliable. This is discussed in #13290.
>
> Cheers,
>
> - Ben
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/glasgow-haskell-users/attachments/20180803/522a1630/attachment.html>


More information about the Glasgow-haskell-users mailing list