Это умышленно.<*>
имеет характеристики тензорного произведения .Это лучше всего видно в монаде списка:
Prelude> (,) <$> ['a'..'e'] <*> [0..4]
[('a',0),('a',1),('a',2),('a',3),('a',4)
,('b',0),('b',1),('b',2),('b',3),('b',4)
,('c',0),('c',1),('c',2),('c',3),('c',4)
,('d',0),('d',1),('d',2),('d',3),('d',4)
,('e',0),('e',1),('e',2),('e',3),('e',4)]
В более общем случае аппликативные функторы (иначе говоря, моноидальные функторы ) отображаются из произведения двух объектов (то есть типа продукта, он же кортеж или черезкаррирование двух аргументов функции ) за функтором к функтору-результату произведения перед функтором.Так что это действительно довольно продуктивная операция.
φ A , B : FA ∙ FB → F ( A ⊗ B )
... в Хаскеле,
φ :: (f a, f b) -> f (a,b)
φ = uncurry (liftA2 (,))
-- recall `liftA2 f x y = f <$> x <*> y`
или даже
{-# LANGUAGE TypeOperators #-}
type x ⊗ y = (x,y)
φ :: f a ⊗ f b -> f (a⊗b)
Чтобы увидеть историческую сторону, загляните в McBride and Paterson 2008 (doi: 10.1017 / S0956796807006326 ),бумага, которая впервые представила класс типов Applicative
.Они отмечают
. В классе Applicative имеется асимметричная операция ⊛
, но существует эквивалентное симметричное определение.
class Functor f -> Monoidal f where
unit :: f ()
(★) :: f a -> f b -> f (a,b)
Эти операции четко определены для любого функтора Applicative..
Итак, <*>
- это ASCII-представление оператора Макбрайда и Патерсона ⊛
, который, в свою очередь, представляет собой «аппликативную» форму ★
, которую теоретики категории называют в неиспользованном виде.форма, φ.