ex (2): `f=(==)` (equivalent to `f a b = a==b` "check equality"): has signature `f :: Eq a => a -> a -> Bool` Now `a` cannot be *any* arbitrary type, it must be a type of the typeclass `Eq` (this is what `Eq a` says). So it takes two aguments and returns a bool. If you invent a new type and want to be able to check whether to values are equal, the you can implement the `Eq` typeclass.
(Similarly, if you have a function that operates on numbers, but you don't care whether it is `Int`s or `Double`s or `Rational`s then you can implement it for the typeclass `Num`. But you can only use the fun…