Yes, there is currying
и это буквально все, что нужно сделать.
Функция типа a -> b -> c
на самом деле имеет тип a -> (b -> c)
- оба они полностью эквивалентны, из-за карри.
Итак, подпись <*>
, как вы говорите, Applicative f => f (a -> b) -> f a - > f b
. Но если b
также является типом функции, скажем, c -> d
, то это может быть специализация:
Applicative f => f (a -> c -> d) -> f a - > f (c -> d)
и т. Д., Если окажется, что d
на самом деле само по себе тип функции.