user1000742
user1000742

Reputation: 183

Haskell: Types don't match

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)?

Upvotes: 6

Views: 4272

Answers (2)

Landei
Landei

Reputation: 54584

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)

Upvotes: 2

dave4420
dave4420

Reputation: 47052

Use fromIntegral to convert the Ints to Floats:

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

Upvotes: 13

Related Questions