Revamping the numeric classes
Ch. A. Herrmann
Wed, 7 Feb 2001 10:12:10 +0100 (MET)
moved to haskell-cafe
Ketil> E.g. way back, I wrote a simple differential equation solver.
Ketil> Now, the same function *could* have been applied to vector
Ketil> functions, except that I'd have to decide on how to implement
Ketil> all the "Num" stuff that really didn't fit well. Ideally, a
Ketil> nice class design would infer, or at least allow me to
Ketil> specify, the mathematical constraints inherent in an
Ketil> algorithm, and let my implementation work with any data
Ketil> satisfying those constraints.
the problem is that the --majority, I suppose?-- of mathematicians
tend to overload operators. They use "*" for matrix-matrix
multiplication as well as for matrix-vector multiplication etc.
Therefore, a quick solution that implements groups, monoids, Abelian
groups, rings, Euclidean rings, fields, etc. will not be sufficient.
I don't think that it is acceptable for a language like Haskell
to permit the user to overload predefined operators, like "*".
A cheap solution could be to define a type MathObject and operators like
:*: MathObject -> MathObject -> MathObject
Then, the user can implement:
a :*: b = case (a,b) of
(Matrix x, Matrix y) -> foo
(Matrix x, Vector y) -> bar