# More type design questions

**Remi Turk
**
rturk@science.uva.nl

*Mon, 18 Aug 2003 22:24:52 +0200*

--ZGiS0Q5IWpPtfppv
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable
On Mon, Aug 18, 2003 at 07:33:47PM +0200, Konrad Hinsen wrote:
>* Well, yes, because my original example was cut down to illustrate the pro=
*blem=20
>* I had. The full version of the class Vect is
*>*=20
*>* class Vect v a where
*>* (<+>) :: Floating a =3D> v a -> v a -> v a
*>* (<->) :: Floating a =3D> v a -> v a -> v a
*>* (<*>) :: Floating a =3D> a -> v a -> v a
*>*=20
*>* I need the parametrization on a in order to be able to define the type of=
*=20
>* scalar multiplication.
*
Would this suffice?
module Foo where
class Vect v a | v -> a where
(<+>), (<->) :: Floating a =3D> v -> v -> v
(<*>) :: Floating a =3D> a -> v -> v
data Vector a =3D Vector a a a deriving (Show)
instance Vect (Vector a) a where
(<+>) =3D fzipWith (+)
(<->) =3D fzipWith (-)
(<*>) =3D fmap . (*)
=20
instance Vect [Vector a] a where
(<+>) =3D zipWith (<+>)
(<->) =3D zipWith (<->)
(<*>) =3D fmap . (<*>)
instance Functor Vector where
fmap f (Vector x y z)
=3D Vector (f x) (f y) (f z)
class Functor z =3D> Ziptor z where
fzipWith :: (a -> b -> c) -> z a -> z b -> z c
instance Ziptor Vector where
fzipWith f (Vector x1 y1 z1) (Vector x2 y2 z2)
=3D Vector (f x1 x2) (f y1 y2) (f z1 z2)
Hm, did anyone else ever want a Ziptor class? (I didn't, until now ;))
Happy hacking,
Remi
--=20
Nobody can be exactly like me. Even I have trouble doing it.
--ZGiS0Q5IWpPtfppv
Content-Type: application/pgp-signature
Content-Disposition: inline
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.2 (GNU/Linux)
iD8DBQE/QTYU36VhKIVjE3sRAmkSAJ0dSXoOsOMOSBXC1pVmkHL+vlc1yACgj2Fk
xcWIHPlLcgpfPgA+tL89FMg=
=Acph
-----END PGP SIGNATURE-----
--ZGiS0Q5IWpPtfppv--