120
 правок
Изменения
→Рациональные числа
==Рациональные числа==
 data Rat = Rat Int Nat
 ratNeg :: Rat -> Rat
 ratNeg (Rat x y) = Rat (intNeg x) y
 ratInv :: Rat -> Rat
 ratInv (Rat (Plus x) y) = Rat (Plus y) x
 ratInv (Rat (Minus x) y) = Rat (Minus y) x
 ratCmp :: Rat -> Rat -> Tri
 ratCmp (Rat a b) (Rat c d) = intCmp (a .*. (Plus d)) (c .*. (Plus b))
 ratEq :: Rat -> Rat -> Bool
 ratEq (Rat a b) (Rat c d) = intEq (a .*. (Plus d)) (c .*. (Plus b))
 ratLt :: Rat -> Rat -> Bool
 ratLt (Rat a b) (Rat c d) = intEq (a .*. (Plus d)) (c .*. (Plus b))
 internalRatPlus :: Rat -> Rat -> Rat
 internalRatPlus (Rat a b) (Rat c d) = Rat ((a .*. (Plus d)) .+. (c .*. (Plus b))) (b *. d)
 internalRatShorten :: Rat -> Rat
 internalRatShorten (Rat (Plus a) b) = Rat (Plus (a /. (gcd a b))) (b /. (gcd a b))
 internalRatShorten (Rat (Minus a) b) = Rat (Minus (a /. (gcd a b))) (b /. (gcd a b))
 infixl 7 %+, %-
 (%+) :: Rat -> Rat -> Rat
 n %+ m = internalRatShorten (internalRatPlus n m)
 (%-) :: Rat -> Rat -> Rat
 n %- m = n %+ (ratNeg m)
 infixl 7 %*, %/
 (%*) :: Rat -> Rat -> Rat
 (Rat a b) %* (Rat c d) = Rat (a .*. c) (b *. d)
 (%/) :: Rat -> Rat -> Rat
 n %/ m = n %* (ratInv m)
==GCD==