Haskell never does implicit type conversion for you. + only works on two numbers of the same type and gives you that type as a result. Any other use of + is a mistake, as you saw with the example (length [1,2,3,4]) + 3.2 .
However, numeric literals are overloaded in Haskell. 2 can be any numeric type, and 3.3 can be any fractional type. Therefore, when Haskell sees the expression 2 + 3.3 , he can try to find a type that is both "numeric" and "fractional", and treat both numbers as this type so that the addition continues.
More specifically, + is of type Num a => a -> a -> a . 2 by itself is of type Num a => a and 3.3 by itself is of type Fractional a => a . Combining these 3 types, in the expression 2 + 3.3 both numbers can be given the Fractional a => a type Fractional a => a , since all Fractional types are also Num types, and this also satisfies the + type. (If you enter this expression in GHCi, a will be populated as Double , because GHC should use the type to evaluate it by default)
In the expression (length [1,2,3,4]) + 3.2 , 3.2 is still overloaded (and in isolation will be of type Fractional a => a ). But length [1,2,3,4] is of type Int . Since one side is a fixed concrete type, the only way to satisfy the type for + would be to populate a on the other type with Int , but this violates the Fractional constraint; there is no way for 3.2 be Int . So this expression is not well printed.
However, any Integral type (of which Int is one) can be converted to any Num type using fromIntegral (this is actually how integer literals, such as 2 , can be thought of as any numeric type). So (fromIntegral $ length [1,2,3,4]) + 3.2 will work.