User-Defined Operators, Re: Function composition and currying

Andrew J Bromage ajb@spamcop.net
Sat, 19 Jul 2003 14:06:44 +1000


G'day all.

On Fri, Jul 18, 2003 at 04:08:25AM -0400, Dylan Thurston wrote:

> What's wrong with that solution?

Working with these operators, I would spend a significant amount of
time getting the '<' and '>' notations right rather than writing
code.  I don't like that.

For example, using the suggested notation:

>  v1 + v2 = v3
>   v1 +> p1 = p2
>   p1 <+ v1 = p2

Quickly, without thinking too much, where do the '<' and '>' signs
go here?

	p1 + v1 + v2
	v1 + v2 + p1
	v1 + p1 + v2

>   p1 <- v1 = p2

I'm pretty sure that's a syntax error.  If not, it probably should be.

> > 	Vector - Point = Point	-- (this rule is a bit controversial)
> This one is obviously an error.  Add Point to both sides to get the
> error that you noted above.

It depends.  If you allow the parity inversion operator -Point, then
this operation makes a certain amount of sense.  Some implementations
(e.g. RenderMan) allow it, some don't.

(But then, RenderMan defines Point + Bivector = Point.  Clifford
algebraists may now run screaming.)

> The other potential solution is to use an 'Additive' class
> 
> class Additive a b c | a b -> c, c a -> b, c b -> a where
>   (+) :: a -> b -> c
> class (Additive c b a) => Subtractive a b c where
>   (-) :: a -> b -> c

Actually, that's not bad at all.  It's certainly better than my
previous suggestion of only putting a b -> c on "Additive" typeclass.

Cheers,
Andrew Bromage