Эта сигнатура типа обозначает функцию, которая принимает параметр типа a и возвращает функцию, которая сама принимает параметр типа b и возвращает функцию, которая сама принимает параметр типа f a и возвращает значение типа f b.
С другой стороны,
(a -> b) -> f a -> f b
обозначает функцию, которая принимает параметр типа a -> b (т.е. функцию, которая принимает параметр типа a и возвращает значение типа b) и возвращает функцию, которая сама принимает параметр типа f a и возвращает значение типа f b.
Вот надуманный пример, иллюстрирующий разницу между двумя типами сигнатур:
f :: (Int -> Bool) -> [Int] -> [Bool]
f = map
g :: Int -> Bool -> [Int] -> [Bool]
g n b = map (\n' -> (n' == n) == b)
λ> let ns = [42, 13, 42, 17]
λ> f (== 42) ns
[True,False,True,False]
λ> g 42 True ns
[True,False,True,False]
λ> g 42 False ns
[False,True,False,True]
Ответ 2
Да,
(a -> b) -> ...
означает "заданная функция, которая берет a в b...". Хотя этот
a -> b -> ...
означает "с учетом некоторых a и некоторых b..."
Ответ 3
Да, (a -> b) означает один аргумент, который является функцией с сигнатурой a -> b, тогда как a -> b -> ... означает два аргумента.