{-# LANGUAGE RebindableSyntax #-}
{-# 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 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)