What’s the precendence of @ in pattern matching?
foo@bar::[] seems to be (foo@bar)::[], not the foo@[bar] equivalent foo@(bar::[]) that I was expecting.
What’s the precendence of @ in pattern matching?
foo@bar::[] seems to be (foo@bar)::[], not the foo@[bar] equivalent foo@(bar::[]) that I was expecting.
It might be because :: binds lower than function application? Like you said foo@[bar] would work, but that’s kind of like foo@((::) bar ()).
I’m sure someone will have a definitive answer … 
The definitive answer here is the section on pattern matching in the Haskell 2010 standard.
But nobody likes reading standards so let me try a more readable summary:
var@pat binds var to pat if pat has arity 0 so takes no arguments (e.g., a variable or True)var @ Some x is a syntax error, you have to parenthesize it and use var @ (Some x) so this is always unambiguous.:: or `C` for some constructor C, the infix pattern has the lowest precedence sofoo@bar::[] parses as (foo@bar)::[] just like Some x::[] parses as (Some x)::[].Thanks for that summary. Having now had a look the standard, I have to say it’s not just a matter of not reading it. I’m not sure I could have derived your summary from it.