Я просто изучаю Haskell и функциональное программирование с помощью книги Ричарда Берда и натолкнулся на сигнатуру типа функции (.). А именнопонимание сигнатуры типа (.)
(.) :: (b -> c) -> (a -> b) -> (a -> c)
и связанное с ним определение
(f . g) x = f (g x)
Я понимаю, что делает оператор, но я немного запутался о том, как читать сигнатуру типа. Говорит ли он, что (.) Принимает в качестве первого аргумента функцию типа (b -> c), затем возвращает функцию типа (a -> b) и, наконец, возвращает функцию типа (a -> c)? Правильно ли это читать подпись типа?
Кроме того, может ли это быть примером currying, где (.) Является карриной функцией, которая принимает два параметра? Или это не правильный способ подумать о карри?