This may be a silly, but I occasionally run into a situation where I'm
wondering what the effective precedence of "if then else" is. I was finally
motivated to do a few experiments, and it seems like the precedence level is
reset (below 0) after "if", "then", and "else".

λ> if not $ False then "here" else "x"
"here"
λ> if False then (++ "y") $ "x" else "here"
"here"
λ> if True then "here" else (++ "y") $ "x"
"here"

I suppose I knew this was the case with "if", but I had not given it much
thought for "then" or "else". Of course, it makes sense. It's the same for
"case" and many other syntactic constructs.

I was wondering where this was defined in the Language Report. I had looked
for prose, but found nothing. Now, I look at it again (with more motivation)
and see it (clearly) in the following excerpt of the grammar (Ch. 3
Expressions):

exp → infixexp :: [context =>] type     (expression type signature)
    | infixexp

infixexp → lexp qop infixexp     (infix operator application)
         | - infixexp     (prefix negation)
         | lexp

lexp → \ apat1 … apatn -> exp     (lambda abstraction, n ≥ 1)
     | let decls in exp     (let expression)
     | if exp [;] then exp [;] else exp     (conditional)
     | case exp of { alts }     (case expression)
     ...

Plainly and simply, this says that all infix expressions (infixexp) are
expressions (exp), and these can be found in "if then else" and "case" among
others. So, while I was looking for something regarding precedence, it is
actually defined straightforwardly in the grammar. In case others happen to
search for the same thing I did, maybe this will provide them with an answer
of sorts.

Regards,
Sean
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to