5
votes

I just tried to write a simple function to calculate the average of the input-Ints:

avg :: Int -> Int -> Int -> Float
avg x y z = (x+y+z)/3

When I exchange the signature to

avg :: Float -> Float -> Float -> Float

it works fine, but with the one above I get the following error message:

Couldn't match expected type 'Float' with actual type 'Int'.

Which possibilites do I have to use the first signature, which accepts Ints (only)?

2

2 Answers

12
votes

Use fromIntegral to convert the Ints to Floats:

avg :: Int -> Int -> Int -> Float
avg x y z = (fromIntegral x + fromIntegral y + fromIntegral z) / 3
2
votes

Shorter:

avg :: Int -> Int -> Int -> Float
avg x y z = (fromIntegral $ sum [x,y,z]) / 3.0

Or you generalize this for a list of Ints:

avg :: [Int] -> Float
avg xs = (fromIntegral $ sum xs) / (fromIntegral $ length xs)