Имеет ли * in (<*>) особое значение? - PullRequest
11 голосов
/ 04 апреля 2019

Пытаясь расширить мое понимание символов в Haskell:

  • ($): оператор приложения функции (позволяет применять аргументы к функции)
  • (&): перевернутая версия оператора приложения функции? (&) = flip ($)
  • (<>): ассоциативный оператор (Вы найдете его в полугруппах и моноидах)
  • (<$>): применение функции ($) поднято над структурой Functor
  • (<&>): перевернутая функторная карта

Можем ли мы сделать ссылку между (*) и (<*>)?

Я не понимаю значения * на самом деле ...

1 Ответ

17 голосов
/ 04 апреля 2019

Это умышленно.<*> имеет характеристики тензорного произведения .Это лучше всего видно в монаде списка:

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-представление оператора Макбрайда и Патерсона , который, в свою очередь, представляет собой «аппликативную» форму , которую теоретики категории называют в неиспользованном виде.форма, φ.

...