module Sqrt
    (sqrt')
where

sqrt' :: Double -> Double
sqrt' x | x >= 0 = sqrt_iter 1 x

sqrt_iter :: Double -> Double -> Double
sqrt_iter guess x
    | good_enough guess x = guess
    | otherwise           = sqrt_iter (improve guess x) x

good_enough :: Double -> Double -> Bool
good_enough guess x = abs (square guess - x) < 0.001

square :: Double -> Double
square x = x * x

average :: Double -> Double -> Double
average x y = (x + y) / 2

improve :: Double -> Double -> Double
improve guess x = average guess (x/guess)

