RosettaCodeData/Task/Exponentiation-operator/Ela/exponentiation-operator-3.ela
2016-12-05 22:15:40 +01:00

28 lines
780 B
Text

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)