--- /dev/null
+-- | Implement ordered pairs all over again for fun (and to make sure
+-- that we can manipulate them algebraically).
+--
+module TwoTuple
+where
+
+data TwoTuple a = TwoTuple a a
+ deriving (Eq, Show)
+
+instance Functor TwoTuple where
+ f `fmap` (TwoTuple x1 y1) = TwoTuple (f x1) (f y1)
+
+
+instance Num a => Num (TwoTuple a) where
+ -- Standard componentwise addition.
+ (TwoTuple x1 y1) + (TwoTuple x2 y2) =
+ TwoTuple (x1 + x2) (y1 + y2)
+
+ -- Standard componentwise subtraction.
+ (TwoTuple x1 y1) - (TwoTuple x2 y2) =
+ TwoTuple (x1 - x2) (y1 - y2)
+
+ -- Left undefined to prevent mistakes. One sane definition
+ -- would be componentwise multiplication.
+ (*) _ _ = error "multiplication of vectors is undefined"
+
+ abs _ = error "absolute value of vectors is undefined"
+
+ signum _ = error "signum of vectors is undefined"
+
+ fromInteger x = TwoTuple (fromInteger x) (fromInteger x)