[ghc-steering-committee] #555: Higher Order Patterns in Rewrite Rules, rec accept

Adam Gundry adam at well-typed.com
Thu Jan 19 21:28:51 UTC 2023


This is a very well-written proposal. I support acceptance.


On 19/01/2023 15:31, Arnaud Spiwack wrote:
> I've got a question though: is the following rewrite rule something I 
> can write in Haskell today?
> 
> ```
> {- RULES … forall f g. map (\x -> f (g x)) = map f . map g
> ```
> 
> In this rule `f (g x)` is not a pattern (because `g` is not rigid). And 
> it is not clear to me how purely syntactic unification and pattern 
> unification interact.

I believe you can write this today, but the template `f (g x)` will 
match only a target with an explicit application where the argument is 
itself an explicit application (e.g. `e1 (e2 x)`).

Under the proposal, `f (g x)` is not in the pattern fragment so it will 
match only an explicit application, but `g x` is a pattern so the 
argument is allowed to be more general, e.g. the template `f (g x)` will 
match `e1 x` or `e1 (e2 x 42 x)`.

At least, this is how I understood the proposal, but I may have 
misinterpreted. The specification could be slightly clearer about how 
this works (in particular the "Ambiguity breaking" point). I've 
commented to that effect on the PR.

Adam


> On Thu, 19 Jan 2023 at 15:51, Chris Dornan <chris at chrisdornan.com 
> <mailto:chris at chrisdornan.com>> wrote:
> 
>     I am sorry for not getting back sooner Joachim,
> 
>     I agree, rewrite rules are cool and this is clearly a useful
>     generalisation.
> 
>     I vote in favour.
> 
>     A small suggestion when crafting instructions to us -- do not under
>     any circumstances, ever, give us the option of doing nothing! You
>     will be taken up on it (which is a sad reflection os us, not you). :-)
> 
>     Chris
> 
>>     On 2023-01-19, at 09:10, Simon Peyton Jones
>>     <simon.peytonjones at gmail.com <mailto:simon.peytonjones at gmail.com>>
>>     wrote:
>>
>>     Dear GHC Steering Committee
>>
>>     Joachim wrote to us ten days ago recommending acceptance of #555. 
>>     No one has responded.
>>
>>     Would you like to respond, please?  (I think this is an easy one.)
>>
>>     Thanks
>>
>>     Simon
>>
>>     On Tue, 10 Jan 2023 at 11:17, Joachim Breitner
>>     <mail at joachim-breitner.de <mailto:mail at joachim-breitner.de>> wrote:
>>
>>         Dear Committee,
>>
>>         Jaro Reinders and Simon PJ propose to allow  Higher Order
>>         Patterns in Rewrite
>>         Rules.
>>
>>         The idea, by way of an example,
>>
>>            {-# RULES forall f.  foo  (\y. f y + f y) = bar f #-}
>>
>>         will now not only match "foo (\y. negate y + negate y)" (with
>>         f set to negate)
>>         but also "foo (\y. y*y + y*y)" (with f set to (\x. x*x)).
>>
>>         Here "f y" is a higher-order pattern, which are restricted to a
>>         _pattern_ variable followed by a list of _local_ variable,
>>         indicating
>>         which variable the matched expression may depend on
>>         (previously, only
>>         closed expressions could be matched).
>>
>>         An implementation is sitting ready at
>>         https://gitlab.haskell.org/ghc/ghc/-/merge_requests/9343
>>         <https://gitlab.haskell.org/ghc/ghc/-/merge_requests/9343>
>>
>>         The design was carefully crafted to be backward-compatible and not
>>         introduce spurious etwa-expansion where there was non before.
>>
>>         It is not guarded by a LANGUAGE pragma (but RULES themselves
>>         are not).
>>         Library authors who care about backward compat will have to
>>         deal with
>>         CPP pragmas.
>>
>>
>>         I’m a big fan of rewrite rules, and the proposal is straight
>>         forward
>>         and provides a feature that I'd maybe optimistically already
>>         assumed to
>>         be there already. Therefore, I’m recommending acceptance.
>>
>>         If you disagree please speak up within two weeks, or speed up the
>>         process by indicating agreement earlier.
>>
>>         Cheers,
>>         Joachim

-- 
Adam Gundry, Haskell Consultant
Well-Typed LLP, https://www.well-typed.com/

Registered in England & Wales, OC335890
27 Old Gloucester Street, London WC1N 3AX, England



More information about the ghc-steering-committee mailing list