structure Rational:NumberSig = struct type num = int * int fun gcd(0,b) = b | gcd(a,b) = gcd(b mod a, a); fun red(a,b) = let val res = gcd(a,b) in (a div res, b div res) end; fun (an, ad) ++ (bn, bd) = red(an*bd + ad*bn, ad*bd); fun (an, ad) -- (bn, bd) = red(an*bd - ad*bn, ad*bd); fun (an, ad) ** (bn, bd) = red(an*bn, ad*bd); fun (an, ad) // (bn, bd) = red(an*bd, ad*bn); fun ~~(n, d) : num = (~n ,d) fun ((an,ad):num) == ((bn,bd):num) = (an*bd = ad*bn); end