Daniel Fischer daniel.is.fischer at web.de
Thu Mar 26 23:42:52 EDT 2009

```Am Freitag 27 März 2009 03:37:27 schrieb 7stud:
> Daniel Fischer <daniel.is.fischer <at> web.de> writes:
> > >  myAvg' :: Int -> [Int] -> [ Double ] -> Double
> > >
> > >  myAvg' sum count []     = sum / fromIntegral count
> > >  myAvg' sum count (x:xs) = myAvg' (x + sum) (n + 1) xs
> > >
> > >
> > >     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]).

```