frag-1.1: src/AFRPAffineSpace.hs
{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies #-}
{- $Id: AFRPAffineSpace.hs,v 1.2 2003/11/10 21:28:58 antony Exp $
******************************************************************************
* A F R P *
* *
* Module: AFRPAffineSpace *
* Purpose: Affine space type relation. *
* Authors: Henrik Nilsson and Antony Courtney *
* *
* Copyright (c) Yale University, 2003 *
* *
******************************************************************************
-}
module AFRPAffineSpace where
import AFRPVectorSpace
------------------------------------------------------------------------------
-- Affine Space type relation
------------------------------------------------------------------------------
infix 6 .+^, .-^, .-.
-- Maybe origin should not be a class method, even though an origin
-- can be assocoated with any affine space.
-- Maybe distance should not be a class method, in which case the constraint
-- on the coefficient space (a) could be Fractional (i.e., a Field), which
-- seems closer to the mathematical definition of affine space, provided
-- the constraint on the coefficient space for VectorSpace is also Fractional.
-- Minimal instance: origin, .+^, .^.
class (Floating a, VectorSpace v a) => AffineSpace p v a | p -> v, v -> a where
origin :: p
(.+^) :: p -> v -> p
(.-^) :: p -> v -> p
(.-.) :: p -> p -> v
distance :: p -> p -> a
p .-^ v = p .+^ (negateVector v)
distance p1 p2 = norm (p1 .-. p2)