
G'day all.
Quoting Bernie Pope
This is a weird example of a pattern binding, and it is surprising (to me) that the syntax is valid.
Maybe. But you wouldn't balk at this: numzeroes xs = sum [ 1 | 0 <- xs ] ...even if you wouldn't naturally express it that way. Patterns like this are useful in places other than lets. I'd find it more surprising if lets were treated as a special case.
In this case you are defining the function which is bound to the variable called "+".
Though thanks to n+k patterns, this is well-understood to be a confusing and controversial case.
One would normally expect to see at least one variable inside the pattern on the left-hand-side of a pattern binding (otherwise what point would there be to the definition?).
If the pattern is demanded (as it may well be in a list comprehension generator, do block generator or a lambda), then it can be very useful. The programmer is asking for an error/empty list/monad "fail" if the conformality check fails. Cheers, Andrew Bromage