{-# LANGUAGE TypeSynonymInstances #-}
-- | The field of rational functions is the field of fractions of k[x].
module Algebra.FieldOfRationalFunctions 
  ( FieldOfRationalFunctions(..)
  , QX, toQX, toQx
  ) where

import Test.QuickCheck

import Algebra.Structures.Field
import Algebra.Structures.FieldOfFractions
import Algebra.UPoly
import Algebra.Q
import Algebra.TypeChar.Char (X_)


-------------------------------------------------------------------------------
-- | Field of rational functions.

type FieldOfRationalFunctions k x = FieldOfFractions (UPoly k x)

-- | The field of fraction of Q[x].
type QX = FieldOfRationalFunctions Q X_

toQX :: Qx -> QX
toQX = toFieldOfFractions

toQx :: QX -> Qx
toQx = fromFieldOfFractions

propFieldQX :: QX -> QX -> QX -> Property
propFieldQX = propField

-- k(x) Num.
instance (Show k, Field k, Num k, Show x) => Num (FieldOfRationalFunctions k x) where
  (+)    = (<+>)
  (-)    = (<->)
  (*)    = (<*>)
  fromInteger x = toFieldOfFractions $ UP [fromInteger x]
  signum = undefined
  abs    = undefined