Аппликативы часто представлены как способ поднять функции с несколькими аргументами в функтор и применить к нему значения функтора. Но мне интересно, есть ли какая-то тонкая дополнительная сила, проистекающая из того факта, что она может делать это, поднимая функции, которые возвращают функцию, и применяя аргументы функции по одному.
Представьте себе, что мы определяем интерфейс на основе подъемные функции, аргумент которых является кортежем аргументов:
# from Functor
fmap :: (a -> b) -> Fa -> Fb
# from Applicative
pure :: a -> Fa
# combine multiple functor values into a functor of a tuple
tuple1 :: Fa -> F(a)
tuple2 :: Fa -> Fb -> F(a,b)
tuple3 :: Fa -> Fb -> Fc -> F(a,b,c)
(etc ...)
# lift multi-argument functions (that take a tuple as input)
ap_tuple1 :: ((a) -> b) -> F(a) -> Fb
ap_tuple2 :: ((a,b) -> c) -> F(a,b) -> Fc
ap_tuple3 :: ((a,b,c) -> d) -> F(a,b,c) -> Fd
(etc ..)
Предположим, у нас была определенная функция кортежа, определенная для каждого кортежа любого размера, с которым мы можем столкнуться. Будет ли этот интерфейс столь же мощным, как интерфейс Applicative, учитывая, что он позволяет поднимать / применять к функциям с несколькими аргументами, НО не позволяет поднимать / применять к функциям, которые возвращают функцию? Очевидно, что можно каррировать функции, которые принимают кортеж в качестве аргумента, чтобы их можно было поднять в аппликативном, и можно откатить функции, которые возвращают функцию, чтобы поднять их в гипотетическую реализацию выше. Но, на мой взгляд, есть небольшая разница в силе. Есть ли разница? (Предполагая, что вопрос даже имеет смысл)