Hello,
I'm working on a desugaring library for Haskell. Desugaring NPlusKPatterns currently takes up the most code, since a proper translation involves generating two guards. Meanwhile, most other pattern-related language extensions are defined in terms of ViewPatterns, which are trivial to desugar.
In my laziness to fix this otherwise, I propose that the following function is added to the Prelude:
> maySubtractIntegral :: Integral a => a -> a -> Maybe a
> maySubtractIntegral k nplusk = if n >= 0 then Just n else Nothing
> where
> n = nplusk - k
So that `NPlusKPatterns` like
< func (n+42) = expr
may be desugared to
< func (maySubtractIntegral 42 -> Just n) = expr
rather than
< func nplusk | n <- nplusk - 42, n >= 0 = expr
The name of this function is, of course, subject to bikeshedding. Note that the signature is correct; though (Ord a, Num a) is more general, it's too weak for the semantics of the language extension.
Discussion period: 2 weeks