Я учусь у " бесплатных аппликативных функторов ". Конечно, вопрос, который я собираюсь задать, отчасти не соответствует основной идее статьи, но все же ...
... на странице 6 предпринята попытка обобщить Functor
до MultiFunctor
:
class Functor f ⇒ MultiFunctor f where
fmap0 :: a → f a
fmap1 :: (a → b) → f a → f b
fmap1 = fmap
fmap2 :: (a → b → c) → f a → f b → f c
...
Я не могу понять, как это определение оправдано с точки зрения теории категорий: fmap2
представляется просто бифунктором, т. Е. Функтором, определенным для категории продуктов . По определению, категория продукта задается всеми возможными упорядоченными парами объектов, и морфизмы также являются парами, следовательно: fmap2 :: (a -> a', b -> b') -> (f a, f b) -> (f a', f b')
выглядит и ощущается как более подходящая сигнатура.
Я могу понять способ мышления, стоящий за выбором (a -> b -> c) -> f a -> f b -> f c
: это просто самый очевидный способ взять известную (a -> b) -> f a -> f b
подпись и заставить ее работать с двоичными функциями, а не с унарными. Но действительно ли MultiFunctor
(заданное выше определением) на самом деле является би- / мультифунктором в том смысле, в котором теория категорий этого ожидает?
P.S. Причина, по которой мне любопытно, заключается в том, что кажется, что не может добраться до Applicative
, обобщив Functor
, хотя в статье говорится, что можно.