Haskell: типы не совпадают - PullRequest
       18

Haskell: типы не совпадают

2 голосов
/ 18 октября 2011

Я просто попытался написать простую функцию для вычисления среднего значения входных Ints:

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

Когда я обмениваю подпись на

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

, она работает нормально, нос вышеупомянутым я получаю следующее сообщение об ошибке:

Не удалось сопоставить ожидаемый тип 'Float' с фактическим типом 'Int'.

Какие возможности мне нужно использовать первую подпись,который принимает Ints (только)?

Ответы [ 2 ]

9 голосов
/ 18 октября 2011

Используйте fromIntegral для преобразования Int с в Float с:

avg :: Int -> Int -> Int -> Float
avg x y z = (fromIntegral x + fromIntegral y + fromIntegral z) / 3
2 голосов
/ 18 октября 2011

Короче:

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

Или вы обобщаете это для списка Int s:

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