vector-space 0.5.1 → 0.5.2
raw patch · 4 files changed
+38/−24 lines, 4 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Data.AdditiveGroup: data Sum a
+ Data.AdditiveGroup: Sum :: a -> Sum a
+ Data.AdditiveGroup: newtype Sum a
+ Data.AffineSpace: instance (AffineSpace p) => AffineSpace (a -> p)
+ Data.AffineSpace: instance (AffineSpace p, AffineSpace q) => AffineSpace (p, q)
+ Data.AffineSpace: instance (AffineSpace p, AffineSpace q, AffineSpace r) => AffineSpace (p, q, r)
- Data.AffineSpace: (.+^) :: (AffineSpace p) => p -> AVector p -> p
+ Data.AffineSpace: (.+^) :: (AffineSpace p) => p -> Diff p -> p
- Data.AffineSpace: (.-.) :: (AffineSpace p) => p -> p -> AVector p
+ Data.AffineSpace: (.-.) :: (AffineSpace p) => p -> p -> Diff p
- Data.AffineSpace: (.-^) :: (AffineSpace p) => p -> AVector p -> p
+ Data.AffineSpace: (.-^) :: (AffineSpace p) => p -> Diff p -> p
- Data.AffineSpace: alerp :: (AffineSpace p) => p -> p -> Scalar (AVector p) -> p
+ Data.AffineSpace: alerp :: (AffineSpace p, VectorSpace (Diff p)) => p -> p -> Scalar (Diff p) -> p
- Data.AffineSpace: class (VectorSpace (AVector p)) => AffineSpace p where { type family AVector p; }
+ Data.AffineSpace: class (AdditiveGroup (Diff p)) => AffineSpace p where { type family Diff p; }
- Data.AffineSpace: distance :: (AffineSpace p, v ~ (AVector p), InnerSpace v, s ~ (Scalar v), Floating (Scalar v)) => p -> p -> s
+ Data.AffineSpace: distance :: (AffineSpace p, v ~ (Diff p), InnerSpace v, s ~ (Scalar v), Floating (Scalar v)) => p -> p -> s
- Data.AffineSpace: distanceSq :: (AffineSpace p, v ~ (AVector p), InnerSpace v) => p -> p -> Scalar v
+ Data.AffineSpace: distanceSq :: (AffineSpace p, v ~ (Diff p), InnerSpace v) => p -> p -> Scalar v
- Data.VectorSpace: lerp :: (VectorSpace v, s ~ (Scalar v), Num s) => v -> v -> s -> v
+ Data.VectorSpace: lerp :: (VectorSpace v) => v -> v -> Scalar v -> v
Files
- src/Data/AdditiveGroup.hs +1/−1
- src/Data/AffineSpace.hs +28/−20
- src/Data/VectorSpace.hs +8/−2
- vector-space.cabal +1/−1
src/Data/AdditiveGroup.hs view
@@ -13,7 +13,7 @@ module Data.AdditiveGroup ( - AdditiveGroup(..), (^-^), sumV, Sum+ AdditiveGroup(..), (^-^), sumV, Sum(..) ) where import Control.Applicative
src/Data/AffineSpace.hs view
@@ -16,6 +16,8 @@ AffineSpace(..), (.-^), distanceSq, distance, alerp ) where +import Control.Applicative (liftA2)+ import Data.VectorSpace infix 4 .+^, .-^, .-.@@ -23,53 +25,59 @@ -- TODO: Convert AffineSpace from fundep to associated type, and eliminate -- FunctionalDependencies above. -class VectorSpace (AVector p) => AffineSpace p where+class AdditiveGroup (Diff p) => AffineSpace p where -- | Associated vector space- type AVector p+ type Diff p -- | Subtract points- (.-.) :: p -> p -> AVector p+ (.-.) :: p -> p -> Diff p -- | Point plus vector- (.+^) :: p -> AVector p -> p---- TODO: consider replacing p and v with a type constructor argument:--- --- class VectorSpace' v => AffineSpace p v | p -> v where--- (.-.) :: p s -> p s -> v s--- (.+^) :: p s -> v s -> p s--- --- Perhaps with constraints on s. We couldn't then define instances for--- doubles & floats.+ (.+^) :: p -> Diff p -> p -- | Point minus vector-(.-^) :: (AffineSpace p) => p -> AVector p -> p+(.-^) :: AffineSpace p => p -> Diff p -> p p .-^ v = p .+^ negateV v -- | Square of the distance between two points. Sometimes useful for -- efficiency. See also 'distance'.-distanceSq :: (AffineSpace p, v ~ AVector p, InnerSpace v) =>+distanceSq :: (AffineSpace p, v ~ Diff p, InnerSpace v) => p -> p -> Scalar v distanceSq = (fmap.fmap) magnitudeSq (.-.) -- | Distance between two points. See also 'distanceSq'.-distance :: (AffineSpace p, v ~ AVector p, InnerSpace v+distance :: (AffineSpace p, v ~ Diff p, InnerSpace v , s ~ Scalar v, Floating (Scalar v)) => p -> p -> s distance = (fmap.fmap) sqrt distanceSq -- | Affine linear interpolation. Varies from @p@ to @p'@ as @s@ varies -- from 0 to 1. See also 'lerp' (on vector spaces).-alerp :: AffineSpace p => p -> p -> Scalar (AVector p) -> p+alerp :: (AffineSpace p, VectorSpace (Diff p)) =>+ p -> p -> Scalar (Diff p) -> p alerp p p' s = p .+^ (s *^ (p' .-. p)) instance AffineSpace Double where- type AVector Double = Double+ type Diff Double = Double (.-.) = (-) (.+^) = (+) instance AffineSpace Float where- type AVector Float = Float+ type Diff Float = Float (.-.) = (-) (.+^) = (+) --- TODO: pairs & triples. Functions? +instance (AffineSpace p, AffineSpace q) => AffineSpace (p,q) where+ type Diff (p,q) = (Diff p, Diff q)+ (p,q) .-. (p',q') = (p .-. p', q .-. q')+ (p,q) .+^ (u,v) = (p .+^ u, q .+^ v)++instance (AffineSpace p, AffineSpace q, AffineSpace r) => AffineSpace (p,q,r) where+ type Diff (p,q,r) = (Diff p, Diff q, Diff r)+ (p,q,r) .-. (p',q',r') = (p .-. p', q .-. q', r .-. r')+ (p,q,r) .+^ (u,v,w) = (p .+^ u, q .+^ v, r .+^ w)+++instance (AffineSpace p) => AffineSpace (a -> p) where+ type Diff (a -> p) = a -> Diff p+ (.-.) = liftA2 (.-.)+ (.+^) = liftA2 (.+^)
src/Data/VectorSpace.hs view
@@ -1,6 +1,7 @@ {-# LANGUAGE MultiParamTypeClasses, TypeOperators , TypeFamilies, UndecidableInstances #-}+{-# OPTIONS_GHC -Wall #-} ---------------------------------------------------------------------- -- | -- Module : Data.VectorSpace@@ -62,8 +63,13 @@ (^*) = flip (*^) -- | Linear interpolation between @a@ (when @t==0@) and @b@ (when @t==1@).-lerp :: (VectorSpace v, s ~ Scalar v, Num s) => v -> v -> s -> v-lerp a b t = (1-t)*^a ^+^ t*^b++-- lerp :: (VectorSpace v, s ~ Scalar v, Num s) => v -> v -> s -> v+lerp :: VectorSpace v => v -> v -> Scalar v -> v+lerp a b t = a ^+^ t *^ (b ^-^ a)++-- lerp :: (VectorSpace v, s ~ Scalar v, Num s) => v -> v -> s -> v+-- lerp a b t = (1-t)*^a ^+^ t*^b -- | Square of the length of a vector. Sometimes useful for efficiency. -- See also 'magnitude'.
vector-space.cabal view
@@ -1,5 +1,5 @@ Name: vector-space-Version: 0.5.1+Version: 0.5.2 Cabal-Version: >= 1.2 Synopsis: Vector & affine spaces, linear maps, and derivatives (requires ghc 6.9) Category: math