On Sun, Nov 6, 2011 at 8:37 AM, Duncan Coutts <duncan.coutts@googlemail.com> wrote:
So I was preparing to commit this change in base and validating ghc whenOn Sun, 2011-08-14 at 14:22 +0100, Johan Tibell wrote:
> On Sun, Aug 14, 2011 at 1:52 PM, Paterson, Ross <R.Paterson@city.ac.uk> wrote:
> > Johan Tibell writes:
> >> This is a call for consensus. Do we agree to add
> >>
> >> infixr 6 <>
> >>
> >> (<>) :: Monoid m => m -> m -> m
> >> (<>) = mappend
> >
> > As I recall, the only remaining issue is that this operator is
> declared as infixl 6 in the pretty package. Someone needs to
> investigate the impact of changing its fixity there.
>
> Already done here: http://hackage.haskell.org/trac/ghc/ticket/3339#comment:22
>
> Seems to be a slight improvement actually.
I discovered a more subtle issue in the pretty package:
Consider
a <> empty <+> b
The fixity of <> and <+> is critical:
(a <> empty) <+> b
= { empty is unit of <> }
(a ) <+> b
a <> (empty <+> b)
= { empty is unit of <+> }
a <> ( b)
Currently Text.Pretty declares infixl 5 <>, <+>. If we change them to be
infixr then we get the latter meaning of a <> empty <+> b. Existing code
relies on the former meaning and produces different output with the
latter (e.g. ghc producing error messages like "instancefor" when it
should have been "instance for").
Suggestions?