-- | Implement ordered pairs all over again for fun (and to make sure
--- that we can manipulate them algebraically).
+-- that we can manipulate them algebraically). Also require (as
+-- opposed to the built-in ordered pairs) that the elements have
+-- matching types.
--
module TwoTuple
where
data TwoTuple a = TwoTuple a a
- deriving (Eq, Show)
+ deriving (Eq)
+
+instance (Show a) => Show (TwoTuple a) where
+ show (TwoTuple x y) = "(" ++ (show x) ++ ", " ++ (show y) ++ ")"
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))
+ norm_2 (TwoTuple x y) = fromRational $ toRational (sqrt(x^2 + y^2))
+
+ -- The infinity norm, i.e. the maximum entry.
+ norm_infty (TwoTuple x y) =
+ fromRational $ max absx absy
+ where
+ absx = abs (toRational x)
+ absy = abs (toRational y)
-- | It's not correct to use Num here, but I really don't want to have
-- to define my own addition and subtraction.