module MyFraction where
Fraction=(Integer,Integer)
ratreduction::Fraction->Fraction
ratreduction(x,y)=(div x g,div y g)where g=gcd x y
ratplus::Fraction->Fraction->Fraction
ratplus(a,b)(c,d)=ratreduction(a*d+b*c,b*d)
ratminus::Fraction->Fraction->Fraction
ratminus(a,b)(c,d)=ratplus(a,b)(-c,d)
rattimes::Fraction->Fraction->Fraction
rattimes(a,b)(c,d)=ratreduction(a*c,b*d)
ratdiv::Fraction->Fraction->Fraction
ratdiv(a,b)(c,d)=rattimes(a,b)(d,c)
ratfloor::Fraction->Integer
ratfloor(a,b)=div a b
ratfloat::Fraction->Float
ratfloat(a,b)=fromInteger a/fromInteger b
rateq::Fraction->Fraction->Bool
rateq(a,b)(c,d)=a*d==b*c
(<+>)::Fraction->Fraction->Fraction
(a,b)<+>(c,d)=ratplus(a,b)(c,d)
(<->)::Fraction->Fraction->Fraction
(a,b)<->(c,d)=ratminus(a,b)(c,d)
(<-*->)::Fraction->Fraction->Fraction
(a,b)<-*->(c,d)=rattimes(a,b)(c,d)
(</>)::Fraction->Fraction->Fraction
(a,b)</>(c,d)=ratdiv(a,b)(c,d)
(<==>)::Fraction->Fraction->Bool
(a,b)<==>(c,d)=rateq(a,b)(c,d)
infixl 6 <-*->,</>
infixl 5 <+>,<->
infixl 4 <==>