Ответ 1
Нет, вы не можете. Вы могли бы представить много особенностей языка, чтобы поддержать это; например тип lambdas на уровне уровня будет естественным:
instance Functor (\c. a -> b -> c) where ...
К сожалению, лямбды уровня типа означают, что мы должны перейти от объединения первого порядка к объединению высшего порядка во время вывода типа, что особенно сложно. (Я хочу сказать, что можно сказать, что я не могу сказать, но я не уверен в этом.)
Вы можете получить на полпути, если вы вставляете явный запрос проверки типов с помощью оболочки newtype
. Стандартный Compose
:
a -> b -> c ~= Compose (a ->) (b ->) c
\c. a -> b -> c ~= Compose (a ->) (b ->)
И действительно, экземпляры Functor
и Applicative
для Compose (a ->) (b ->)
- это именно те, которые вы ожидаете для \c. a -> b -> c
, ценой небольшого синтаксического шума при создании и потреблении значений этого типа.