Hal Daume answers a question on how to define nice, infix ops
acting on vectors:

What you want to do is make your Vector an instance of the Num(eric)
type class.  For instance:

instance Num Vector where
  (+) v1 v2 = zipWith (+) v1 v2
  (-) v1 v2 = zipWith (-) v1 v2
  negate v1 = map negate v1
  abs v1 = map abs v1
  (*) v1 v2 = ...
  fromInteger i = ...
  signum v1 = ...

I've left the last three blank because it's unclear what should go
there.  Since (*) has type Vector->Vector->Vector (in this instance),
you can't use dot product or something like that.

signum :: Vector->Vector could be written and just return [-1], [0] or
[1], I suppose.

fromInteger :: Integer->Vector is a little harder.  Perhaps just
'fromInteger i = [fromInteger i]' would be acceptable.  Or you could
leave these undefined.

 --
 Hal Daume III                                   | [EMAIL PROTECTED]
 "Arrest this man, he talks in maths."           | www.isi.edu/~hdaume

While this is a possible solution, I would shout loudly: "Arrest this man, he is disrespectful wrt math!". Actually, this shows once more that the Num class and its relatives is a horror...

Signum in this context has no sense. The multiplication might be the cross
product, but its anti-commutativity shows plainly that this is not a 'standard'
multiplication. 'fromInteger' has even less sense than signum...
I am particularly horrified by "abs v = map abs v", and I am sure all of you
see why.


I think that a more sane solution would be the definition of a particular class with operations porting names like <+>, or ^+^, or whatever similar to standard ones, but different.

Jerzy Karczmarczuk


_______________________________________________ Haskell mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell

Reply via email to