A function with signature Num a => a
is expected to work for any type in the class Num
. The implementation 5.0 :: Double
just works for one type, not for all types of the class, so the compiler complains.
An example of a generic function would be:
square :: (Num a) => a -> a
square x = x * x
This works for any type that is a Num
. It works for doubles, integers and whatever other numbers you want to use. Because of that it can have a generic type signature that just requires the parameter to be in class Num
. (Type class Num
is necessary because the function uses multiplication with *
, which is defined there)