Lauri Alanko wrote:
fac :: Integer -> Integer fac n = product [1..n]
term :: Double -> Integer -> Double term x n = (-1.0::Double)**(fromInteger n) * (x**(fromInteger (2*n + 1))) / (fromInteger (fac (2*n + 1)))
Why do you have all those type annotations? Simply writing directly:
fac n = product [1..n] term x n = -1 ** n * (x ** (2 * n + 1)) / fac (2 * n + 1)
gives you functions for which are inferred the types (which you can of course also give explicitly if you want):
fac :: (Enum a, Num a) => a -> a term :: (Floating a, Enum a) => a -> a -> a
And the type variable a can then be instantiated for Double.
Except that it's arguable that Double shouldn't be an instance of Enum. Really, this "solution" is relying upon a misfeature of the language; one which won't work in the general case. Suppose that fac was a different function, one which couldn't be defined as returning a non-integral result without using an explicit (and conceptually incorrect) type conversion. -- Glynn Clements <glynn.clements@virgin.net>