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.