module DDF.Vector where
import DDF.Double
import qualified Prelude as M
class Monoid r g => Group r g where
invert :: r h (g -> g)
minus :: r h (g -> g -> g)
default invert :: DBI r => r h (g -> g)
invert = minus1 zero
default minus :: DBI r => r h (g -> g -> g)
minus = lam2 $ \x y -> plus2 x (invert1 y)
class Group r v => Vector r v where
mult :: r h (M.Double -> v -> v)
divide :: r h (v -> M.Double -> v)
default mult :: Double r => r h (M.Double -> v -> v)
mult = lam2 $ \x y -> divide2 y (recip1 x)
default divide :: Double r => r h (v -> M.Double -> v)
divide = lam2 $ \x y -> mult2 (recip1 y) x
minus2 = app2 minus
mult1 = app mult
mult2 = app2 mult
divide2 = app2 divide
invert1 = app invert
minus1 = app minus
divide1 = app divide
recip = divide1 doubleOne
recip1 = app recip
instance Double r => Monoid r M.Double where
zero = doubleZero
plus = doublePlus
instance Double r => Group r M.Double where
minus = doubleMinus
instance Double r => Vector r M.Double where
mult = doubleMult
divide = doubleDivide