{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances #-}

{- |
Copyright   :  (c) Henning Thielemann 2005
License     :  GPL

Maintainer  :  numericprelude@henning-thielemann.de
Stability   :  provisional
Portability :  requires multi-parameter type classes

Abstraction of normed vector spaces
-}

module Algebra.NormedSpace.Maximum where

import PreludeBase
import NumericPrelude

import qualified Number.Ratio as Ratio

import qualified Algebra.PrincipalIdealDomain as PID
import qualified Algebra.Real     as Real
import qualified Algebra.Module   as Module

class (Real.C a, Module.C a v) => C a v where
  norm :: v -> a

{-
instance (Ring.C a, Algebra.Module a a) => C a a where
  norm = abs
-}
instance C Float Float where
  norm = abs

instance C Double Double where
  norm = abs

instance C Int Int where
  norm = abs

instance C Integer Integer where
  norm = abs


instance (Real.C a, PID.C a) => C (Ratio.T a) (Ratio.T a) where
  norm = abs

instance (Ord a, C a v0, C a v1) => C a (v0, v1) where
  norm (x0,x1) = max (norm x0) (norm x1)

instance (Ord a, C a v0, C a v1, C a v2) => C a (v0, v1, v2) where
  norm (x0,x1,x2) = (norm x0) `max` (norm x1) `max` (norm x2)

instance (Ord a, C a v) => C a [v] where
  norm = foldl max zero . map norm
--  norm = maximum . map norm