
On 11/29/06, Krasimir Angelov
Hi Slavomir,
On 11/28/06, Slavomir Kaslev
wrote: instance Num Float3 where ..... signum a | a == Float3 0 0 0 = 0 | otherwise = 1
signum has a natural generalization for vectors.
signum v = vector with the same direction as v but with |v| = 1
where |v| is the absolute length of v. The problematic function in Num is abs. Ideally abs should be defined as:
abs v = |v|
but its type is Float3 -> Float while the Num class requires Float3 -> Float3.
You mean signum = normalize? What do you think of my comments here:
After giving some thought on signum, I got to the point, that signum should be defined so that abs x * signum x = x holds. So it can be defined as signum (Vec2 x y) = Vec 2 (signum x) (signum y).
It turns out that all the functions in Num, Floating, etc. classes can be given meaningful definitions for vectors in this pattern. That is f (Vecn x1 x2 .. xn) = Vecn (f x1) ... (f xn). And all expected laws just work. One can think of that like the way SIMD processor works, it does the same operations as on floats but on four floats at parallel.
I think this is the way to define vector instances for Num, Floating, etc. For vector specific operations, such as normalize, len, dot, cross, etc. are declared in class Vector. -- Slavomir Kaslev