(a -> b -> c)
means any function that takes a type a
and a type b
and returns a type c
.
There is nothing to stop you from using a function that has the signature (a -> a -> a)
, it just happens that in this case the types are all the same.
Assume you had a method with this signature:
zipWith' :: (a -> a -> a) -> [a] -> [a] -> [a]
you couldn't use a method with a signature of (a -> b -> c)
in this case as the expected method signature is more restrictive.