
Am Freitag 27 März 2009 03:37:27 schrieb 7stud:
Daniel Fischer
writes: myAvg' :: Int -> [Int] -> [ Double ] -> Double
myAvg' sum count [] = sum / fromIntegral count myAvg' sum count (x:xs) = myAvg' (x + sum) (n + 1) xs
ehask.hs:2:24: Couldn't match expected type `Double' against inferred type `Int' In the expression: s / fromIntegral count In the definition of `myAvg'': myAvg' s count [] = s / fromIntegral count Failed, modules loaded: none.
Yup, the type signature is wrong, it should be
myAvg' :: Double -> Int -> [Double] -> Double
Can you explain the error message in detail? To me it looks like this should be the problem:
Prelude> fromIntegral [1, 2, 3]
<interactive>:1:0: No instance for (Integral [t]) arising from a use of `fromIntegral' at <interactive>:1:0-21 Possible fix: add an instance declaration for (Integral [t]) In the expression: fromIntegral [1, 2, 3] In the definition of `it': it = fromIntegral [1, 2, 3]
That would be the next problem. By the type signature, the result of myAvg' is a Double, hence the use of (/) in the first equation is at type Double -> Double -> Double. Now the first argument of (/) is s(um), which by the type signature is of type Int, while (/) expects Double. So, expected type is Double, 'inferred' (from the type signature) type is Int, doesn't match, boom. The compiler stops there, if it didn't, it would also report the missing instance for (Integral [Int]).