--- /dev/null
+{-# LANGUAGE FlexibleInstances #-}
+
+-- | The 'Normed' class represents elements of a normed vector
+-- space. We define instances for all common numeric types.
+module Normed
+where
+
+import Data.Number.BigFloat
+
+class Normed a where
+ norm_p :: (Integral c, RealFrac b) => c -> a -> b
+ norm_infty :: RealFrac b => a -> b
+
+-- Define instances for common numeric types.
+instance Normed Integer where
+ norm_p _ = fromInteger
+ norm_infty = fromInteger
+
+instance Normed Rational where
+ norm_p _ = fromRational
+ norm_infty = fromRational
+
+instance Epsilon e => Normed (BigFloat e) where
+ norm_p _ = fromRational . toRational
+ norm_infty = fromRational . toRational
+
+instance Normed Double where
+ norm_p _ = fromRational . toRational
+ norm_infty = fromRational . toRational