open number //A class that defines our overloadable function class Exponent a where (^) a->a->_ //Implementation for integers instance Exponent Int where _ ^ 0 = 1 x ^ n | n > 0 = f x (n - 1) x |else = fail "Negative exponent" where f _ 0 y = y f a d y = g a d where g b i | even i = g (b * b) (i `quot` 2) | else = f b (i - 1) (b * y) //Implementation for floats instance Exponent Single where x ^ n | n < 0.001 = 1 | n > 0 = f x (n - 1) x | else = fail "Negative exponent" where f a d y | d < 0.001 = y | else = g a d where g b i | even i = g (b * b) (i / 2) | else = f b (i - 1) (b * y) (12 ^ 4, 12.34 ^ 4.04)