]> gitweb.michael.orlitzky.com - numerical-analysis.git/commitdiff
Add a Vector class and make TwoTuple (and several base types) instances of it.
authorMichael Orlitzky <michael@orlitzky.com>
Sun, 14 Oct 2012 18:04:31 +0000 (14:04 -0400)
committerMichael Orlitzky <michael@orlitzky.com>
Sun, 14 Oct 2012 18:04:31 +0000 (14:04 -0400)
src/TwoTuple.hs
src/Vector.hs [new file with mode: 0644]

index 8493114ed7cac3dcc956a801127e5b43eca0efef..daeb6e41f8cdbbbe43e11139236dbc88f5955c18 100644 (file)
@@ -4,13 +4,22 @@
 module TwoTuple
 where
 
+import Vector
+
+
 data TwoTuple a = TwoTuple a a
   deriving (Eq, Show)
 
 instance Functor TwoTuple where
   f `fmap` (TwoTuple x1 y1) = TwoTuple (f x1) (f y1)
 
+instance (RealFloat a) => Vector (TwoTuple a) where
+  -- The standard Euclidean 2-norm. We need RealFloat for the square
+  -- root.
+  norm (TwoTuple x1 y1) = fromRational $ toRational (sqrt(x1^2 + y1^2))
 
+-- | It's not correct to use Num here, but I really don't want to have
+--   to define my own addition and subtraction.
 instance Num a => Num (TwoTuple a) where
   -- Standard componentwise addition.
   (TwoTuple x1 y1) + (TwoTuple x2 y2) =
diff --git a/src/Vector.hs b/src/Vector.hs
new file mode 100644 (file)
index 0000000..e608a50
--- /dev/null
@@ -0,0 +1,24 @@
+{-# LANGUAGE FlexibleInstances #-}
+
+-- | The 'Vector' class represents elements of a normed vector
+--   space. We define instances for all common numeric types.
+module Vector
+where
+
+import Data.Number.BigFloat
+
+class Vector a where
+  norm :: RealFrac b => a -> b
+
+-- Define instances for common numeric types.
+instance Vector Integer where
+  norm = fromInteger
+
+instance Vector Rational where
+  norm = fromRational
+
+instance Epsilon e => Vector (BigFloat e) where
+  norm = fromRational . toRational
+
+instance Vector Double where
+  norm = fromRational . toRational