On 11/29/06, Krasimir Angelov <[EMAIL PROTECTED]> wrote:
Hi Slavomir,

On 11/28/06, Slavomir Kaslev <[EMAIL PROTECTED]> 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
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to