How can i know when casting of types maked by compiler and when programmer must to do it?

On Tue, Apr 5, 2011 at 12:14 PM, Daniel Fischer <daniel.is.fischer@googlemail.com> wrote:
On Tuesday 05 April 2011 10:38:37, Nadav Chernin wrote:
> Why only  "length as" we must to cast? Why "sum as", that have type
> Integer can be used in (/).
>
> :t (/)
>
> (/) :: (Fractional a) => a -> a -> a

No, sum as has the type of as's elements,

sum :: Num a => [a] -> a

So the use of (/) refines the constraint from (Num a) to (Fractional a).
if you want it to work on Integers too,
you'd get

mean :: (Real a, Fractional b) => [a] -> b
mean xs = realToFrac (sum xs) / (fromIntegral $ length xs)