[Haskell-cafe] Suggestion for implementation of vector library
Olex P
hoknamahn at gmail.com
Tue Jun 17 11:04:11 EDT 2008
Hi guys,
Sorry for a silly questions but I didn't find a proper answer in Google.
I've started to learn Haskell and would like to implement a library for work
with vectors. I found different implementations of this stuff but all of
them made just for fun in a short as possible terms using lists or tuples. I
suppose there should be a better way to go. First idea came to my mind was
using of classes. Something like this:
[code]
-- Template Vector class
class Vector v where
(<+>) :: v -> v -> v
(<->) :: v -> v -> v
(<*>) :: v -> v -> v
(*>) :: v -> Float -> v
-- other methods here
-- Vector3 instance
-- Declare new Vector3 type
data Vector3 = Vector3 (Float, Float, Float)
instance Vector Vector3 where
(<+>) (Vector3 (x1, y1, z1)) (Vector3 (x2, y2, z2)) = Vector3 (x1 + x2,
y1 + y2, z1 + z2)
(<->) (Vector3 (x1, y1, z1)) (Vector3 (x2, y2, z2)) = Vector3 (x1 - x2,
y1 - y2, z1 - z2)
(<*>) (Vector3 (x1, y1, z1)) (Vector3 (x2, y2, z2)) = Vector3 (x1 * x2,
y1 * y2, z1 * z2)
(*>) (Vector3 (x, y, z)) f = Vector3 (x * f, y * f, z * f)
length (Vector3 (x, y, z)) = sqrt (x * x + y * y + z * z)
-- the rest of methods
[/code]
What I don't like here is using of data type constructors when even simple
expression like v1 + v2 becomes too long (<+>) (Vector3 (1,2,3)) (Vector3
(4,5,6))
Do I really need a data type constructor (in this particular case)? Or
better to declare a vector3 type as: type Vector3 = (Float, Float, Float)?
Next question is how to make one instance which derives from several
classes? For example from Eq, Num and Vector (if I want to overload +, -, <,
>, == etc.)
Is it good idea to use classes and ad hoc polymorphism or better to use
parametric polymorphism? How you would implement such library? (not just for
educational purposes but for development of _very_good_extensible_ software)
Thank you,
Alex.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/haskell-cafe/attachments/20080617/ee94bf9c/attachment.htm
More information about the Haskell-Cafe
mailing list