In C, it wouldn't be, since there, unary ops always bind tighter than infix
ops, and the precedences used in C are also used in C++, Java, C#,
Javascript etc, and even ISO Prolog obeys the rule that unary minus binds
tighter so making unary minus have the same precedence as infix minus just
makes Haskell syntax difficult to parse for anyone coming from one of these
other very popular languages. Imho, for better or worse, C has established a
kind of de-facto standard that unary ops always bind tighter than infix ops
in programming languages ;-)

... in **programming languages that don't have infix exponeniation**.
You missed Ruby, Python, Matlab, Mathematica (not generally a good
inspiration for syntax but it has a rather large following and almost
20 years of usage), and TI calculators. These all have ^ or ** bind
tighter than unary - to go along with math, not C. Since it didn't
happen we will never know **if C had had infix exponentiation, what
would the precedence have been relative to unary ops** or indeed if
they dropped infix exponentiation, preferring pow(x,y), for exactly
that reason, or what.

All this talk is a design choice and folks will naturally disagree and
the "right" balance for *everything*, especially since all their
conflicting interactions yield so many mutually exclusive possible
outcomes. I suppose I just disagree that C has said the last word
about infix/unary ops because C never spoke up on the problem of unary
negation and exponentiation. (And if it had, would I agree anyway? :-)

I still get tripped up by unary negation in Haskell, especially with
sections, parenthese, etc. But that's what hugs or ghci are for.

Also, it's a good example of why we should *not* have unary minus, since the
above could be written with no ambiguity as:
    negate (4 ^ 2)
or better still:
    negate (expNat 4 2)
because this would free the ^ symbol for some more widely applicable use,

True. I would much rather be forced to type negate (4 ^ 2) than have
-4^2 return 16 instead of -16 because the - got lexed into -4.
Alternately, if you want unary ops to bind the tightest, then just
eliminating ^ and replacing it with expNat, etc. would solve any
precedence problems with unary minus.

 Jared.
--
http://www.updike.org/~jared/
reverse ")-:"
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to