{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE RebindableSyntax #-} -- | The 'Normed' class represents elements of a normed vector -- space. We define instances for all common numeric types. module Normed where import BigFloat import NumericPrelude hiding (abs) import Algebra.Absolute import Algebra.Field import Algebra.Ring import Algebra.ToInteger -- Since the norm is defined on a vector space, we should be able to -- add and subtract anything on which a norm is defined. Of course -- 'Num' is a bad choice here, but we really prefer to use the normal -- addition and subtraction operators. class (Algebra.Ring.C a, Algebra.Absolute.C a) => Normed a where norm_p :: (Algebra.ToInteger.C c, Algebra.Field.C b, Algebra.Absolute.C b) => c -> a -> b norm_infty :: (Algebra.Field.C b, Algebra.Absolute.C b) => a -> b -- | The "usual" norm. Defaults to the Euclidean norm. norm :: (Algebra.Field.C b, Algebra.Absolute.C b) => a -> b norm = norm_p (2 :: Integer) -- Define instances for common numeric types. instance Normed Integer where norm_p _ = abs . fromInteger norm_infty = abs . fromInteger instance Normed Rational where norm_p _ = abs . fromRational' norm_infty = abs . fromRational' instance Epsilon e => Normed (BigFloat e) where norm_p _ = abs . fromRational' . toRational norm_infty = abs . fromRational' . toRational instance Normed Float where norm_p _ = abs . fromRational' . toRational norm_infty = abs . fromRational' . toRational instance Normed Double where norm_p _ = abs . fromRational' . toRational norm_infty = abs . fromRational' . toRational