Rational numbers homework

Implement rational numbers, i.e. numbers on the form n/m where m is always greater than 0. Fraction is a type synonym for the type (Integer, Integer).
Define the following functions:

          type Fraction = (Integer, Integer)
          ratplus  :: Fraction -> Fraction -> Fraction
          ratminus :: Fraction -> Fraction -> Fraction
          rattimes :: Fraction -> Fraction -> Fraction
          ratdiv   :: Fraction -> Fraction -> Fraction
          ratfloor :: Fraction -> Integer
          ratfloat :: Fraction -> Float
          rateq    :: Fraction -> Fraction -> Bool

ratfloor will result in the greatest integer less than its argument.

An example of a hugs-dialogue:

 
         Main> ratplus (3,5) (rattimes (2,3) (2,1))
         (29, 15)
         Main> ratminus (29,15) (3,1) 
         (-16, 15)
         Main> ratfloor (-16,15)
         -2
         Main> ratfloat (15,8)
         1.875
         Main>
You can change the syntax to use infix notation for the binary functions, and also make sure that the rational number is on canonical form, i.e. the number 2/6 should be 1/3 etc.

We can now compute with exact rational numbers.

Implement an approximation of the square root of 2 by using the following iteration: The initial approximation of x is 1. The next approximation is obtained by letting the next value of x be (x + 2/x)/2. This last step is then repeated. You can do this by defining a function

iter :: Integer -> Fraction -> Fraction 
which iterates the same number of times as the value of the first argument.

Practical hints

Use a standard text editor to make your definitions in a file. Use then the Hugs command
:load 
to read your definitions. If you change the file, you also have to reload it. Make sure that your hand-in has some examples how to run the programs.
Last modified: Thu Oct 9 10:43:19 KST 2003