{-# LANGUAGE NoImplicitPrelude #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE FlexibleInstances #-} {- | Copyright : (c) Henning Thielemann 2005 License : GPL Maintainer : numericprelude@henning-thielemann.de Stability : provisional Portability : requires multi-parameter type classes Abstraction of normed vector spaces -} module Algebra.NormedSpace.Sum where import PreludeBase import NumericPrelude import qualified Number.Ratio as Ratio import qualified Algebra.PrincipalIdealDomain as PID import qualified Algebra.Real as Real import qualified Algebra.Additive as Additive import qualified Algebra.Module as Module {-| The super class is only needed to state the laws @ v == zero == norm v == zero norm (scale x v) == abs x * norm v norm (u+v) <= norm u + norm v @ -} class (Real.C a, Module.C a v) => C a v where norm :: v -> a {- instance (Ring.C a, Algebra.Module a a) => C a a where norm = abs -} instance C Float Float where norm = abs instance C Double Double where norm = abs instance C Int Int where norm = abs instance C Integer Integer where norm = abs instance (Real.C a, PID.C a) => C (Ratio.T a) (Ratio.T a) where norm = abs instance (Additive.C a, C a v0, C a v1) => C a (v0, v1) where norm (x0,x1) = norm x0 + norm x1 instance (Additive.C a, C a v0, C a v1, C a v2) => C a (v0, v1, v2) where norm (x0,x1,x2) = norm x0 + norm x1 + norm x2 instance (Additive.C a, C a v) => C a [v] where norm = sum . map norm