David House wrote:

> Also, it provides an infinite space for fixities. I think the problem
> 'binds tighter than X but not as tight as Y', where X and Y are only
> fixity integer apart is somewhat common, and this would fix it. It
> would allow for extensibility into the future, where the operator
> space will only become more dense, and maintaining a complete order
> with only 10 integers to play will become more and more difficult.
> Allowing an infinite amount of operators to come between any two
> operators sounds like a solid design decision to me.

For me, the most important objection to specifying precedence by an
embedding into some total order -- be it the integers or the rationals --
is that it forces you to make a global decision, and that threatens
modularity.

Consider the following scenario:

- Two unrelated pieces of code each define an operator (`A` resp. `B`).
The writers choose their precedences with due regard to relations to basic
operators and maybe other relevant ones, but *not considering their mutual
relation*. The last writer may not know about the code of the first one,
or did not bother to consider the possibility of mixing it with his code
(it is unreasonable to expect a writer to consider the relation to every
other existing operator).
- At some point, `A` and `B` meet; maybe they are part of two unrelated
libraries and a programmer uses them both, or maybe `A` was defined by a
programmer who just found out that there exists this wonderful library
exporting `B`.
- Now, if she is lucky, the relative precedence of `A` and `B` just
happens to be nice and logical. If she is unlucky and the relative
precedence is really annoying, the precedence of at least one of `A` and
`B` will have to change to fix this. However, if you change the precedence
of `B`, say, (which currently is "written in stone forever", as Nicolas
Frisby put it,) and `B` is an operator of any significance, then you have
to send out an announcement to everyone who uses `B`, telling them that
its precedence has changed, so they should check if that breaks any of
their code. If it does, they may have to change the precedence of other
operators, propagating a horrible cascade of realignment.

That's a whole yotta words for a small bikeshed, but I think this scenario
is actually not far-fetched at all.

Specifying precedence 'lazily', by a partial order, does not suffer from
this problem, because it only requires you to make local decisions.


Kind regards,

Arie

-- 

Mr. Pelican Shit may be Willy.

  ^
 /e\
 ---


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

Reply via email to