
On Sat, 11 Jun 2005, David Roundy wrote:
How can we overload (+) and (-) without also overloading (*)? They're all in the same class.
Unfortunately yes. This is the reason for the type class system of http://cvs.haskell.org/darcs/numericprelude/ Since this framework is under progress and it may annoy people to use non-standard classes you may to stick to Prelude's Num class which forces you to define (*) whenever you only want (+) and (-). So in this case you could only define (*) = undefined which is not nice because it is only checked at runtime, but the numeric type classes are also not nice. :-)
If you know of a nice representation for tensor multiplication, I'd be very interested to hear about it. If you don't, then I'm not sure how the creation of O(N^2) multiplication operators (where N is the highest rank tensor supported) can be viewed as an improvement over treating everything as a matrix.
I would define the types Vector Matrix Tensor (for any rank, including 1 and 2) A rank 1 tensor would be different from a vector and a rank 2 tensor would be different from a matrix. This is seems to be ok, since vectors and matrices belong to one theory and tensors are somehow different.
Inventing a new interface for linear algebra is an interesting problem, but I'd be satisfied with a "matlab with a nice programming language"...
Haskell with weak matrix typing will be at least as broken as MatLab.
Fortunately, the brokenness of matlab that bothers me isn't its matrix operators, but rather it's features as a programming language.
I hope you never had to search for a bug which is caused whenever two automatisms of MatLab collide. E.g. polyder([0,0,0,0,1,0]) is not [0,0,0,0,1] as you might expect but [1]. Thus polyder([0,0,0,0,1,0]) + [1,0,0,0,0] is [2,1,1,1,1] ! This is so because adding a scalar to a vector is interpreted as expanding the scalar to a vector by replication and add it to the vector.