Я понимаю, что (->) a
является типом более высокого порядка * -> *
, который при применении к аргументу типа b
дает тип a -> b
Можно ли написать тип вида * -> *
, который при применении к c
дал бы a -> b -> c
?
Если нет, почему бы и нет? Возможно, используя некоторые расширения языка и forall
?
Это позволило бы мне написать экземпляры Functor и Applicative (и других классов), где функториальная структура "a -> b ->
", как в:
(<*>) :: Applicative t => t (c -> d) -> t c -> t d
(<*>) :: (a -> b -> c -> d) -> (a -> b -> c) -> a -> b -> d
Это было бы полезно в качестве комбинатора для двоичных (curried) функций.
NB. Возможно, это связано с Функторами и Применениями для типов вида (* → *) → *, но я не уверен, потому что это пошло мне на голову: -)