{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances #-}
module Algebra.VectorSpace where

import qualified Algebra.Module as Module
import qualified Algebra.Field  as Field
import qualified Algebra.PrincipalIdealDomain as PID
import qualified Number.Ratio   as Ratio

import qualified Data.Complex as Complex98

-- import NumericPrelude.Numeric
import qualified Prelude as P


class (Field.C a, Module.C a b) => C a b


{-* Instances for atomic types -}

instance C P.Float P.Float

instance C P.Double P.Double

{-* Instances for composed types -}

instance (PID.C a) => C (Ratio.T a) (Ratio.T a)

instance (C a b0, C a b1) => C a (b0, b1)

instance (C a b0, C a b1, C a b2) => C a (b0, b1, b2)

instance (C a b) => C a [b]

instance (C a b) => C a (c -> b)

instance (C a b, P.RealFloat b) => C a (Complex98.Complex b)