module Algebra.Structures.Field
( module Algebra.Structures.IntegralDomain
, Field(inv)
, propField
, (</>)
) where
import Test.QuickCheck
import Algebra.Structures.Ring
import Algebra.Structures.IntegralDomain
infixl 7 </>
class IntegralDomain a => Field a where
inv :: a -> a
propMulInv :: (Field a, Eq a) => a -> Bool
propMulInv a = a == zero || inv a <*> a == one
propField :: (Field a, Eq a) => a -> a -> a -> Property
propField a b c = if propMulInv a
then propIntegralDomain a b c
else whenFail (print "propMulInv") False
(</>) :: Field a => a -> a -> a
x </> y = x <*> inv y