значение `<>` в этом семействе `<*>, <$>, <&>` - PullRequest
1 голос
/ 27 апреля 2019

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

 $  : Function Application operator (Allow you to apply arguments over a function)
 &  : flipped version of Function Application Operator? (&) = flip ($)
<>  : associative operator (You'll find it in Semigroups and Monoids)
<$> : function application ($) lifted over a Functor structure
<&> : flipped functor map
<*> : applicative operator

Можем ли мы установить связь между <> и этим семейством <*>,<$>,<&>?Я быстро пришел к выводу, глядя только на <*>,<$>,<&>, что <..> имеет отношение к чему-то над структурой, но тогда какова связь между структурой и ассоциативным оператором?

Ответы [ 2 ]

8 голосов
/ 27 апреля 2019

Эти имена не произошли из какой-то всеобъемлющей концептуальной схемы.Лучший способ убедиться в этом - проследить их историю:

  • Макбрайд и Патерсона Прикладное программирование с эффектами использует звездочку в круге,As, как бинарный оператор Applicative (обратите внимание, что есть теоретические причины , чтобы выбрать * -подобный символ, который предлагает продукт).Когда Control.Applicative добрался до base (то есть в base -2.1 / GHC 6.6 / October 2006), это стало <*>, чтонасколько я могу судить, наиболее близкое к этому ASCII-приближение.

  • Первая версия Control.Applicative уже содержит <$>, а финальная версия Применимое программированиес эффектами , на которые я ссылался выше, также упоминается (с небольшим отличием, что <$> имеет ограничение Applicative).Точка выбора мэшапа $ и <*> в качестве оператора fmap, по-видимому, позволяла нам писать красивые аппликативные выражения стиля (f <$> u <*> v <*> w), которые могли бы быть приемлемой заменой идиомных скобок, упомянутых в этой статье.(который, визуализированный в ASCII, выглядит как [| f u v w |]).

  • Класс Monoid возник еще раньше в истории base (он ужесуществовал по состоянию на GHC 5.04.2, в Control.Monad.Monoid модуле );однако до версии 4.5 не было инфиксной версии mappend в base (GHC 7.4, начало 2012 г.). Прикладное программирование с эффектами также упоминает моноиды и предлагает обведенный кружком плюс, ⊕, в качестве бинарного оператора для mappend.Насколько я могу судить, имя <> было впервые предложено Россом Патерсоном в ветке списка рассылки Библиотеки с 2009 и превратилось в существующее предложение GHC , ипредположительно также полугруппы Эдварда Кметта пакет , чей модуль Data.Semigroup был в конечном итоге принят base .Патерсон выбрал <> в качестве нейтрального имени, которое не предполагает какого-либо конкретного моноида (см. Также: Почему псевдоним mappend infix <> вместо +? ).

1 голос
/ 27 апреля 2019

Насколько я понимаю, <..> не имеет общего значения.Однако, безусловно, есть некоторые связи с другими операторами, и большинство перечисленных операторов имеют своего рода мнемоническое значение:

  • $ - это приложение функции: f $ x = f x.<$> явно вдохновлен $: в то время как f $ x применяет f к x, f <$> x применяет f к каждому элементу внутри x.(Лично я <$> - мой любимый оператор.)
  • То же соотношение между & и <&>.
  • <> - это оператор моноидального добавления: "x" <> "y" <> "z",Sum 1 <> Sum 2 <> Sum 3.( РЕДАКТИРОВАТЬ: Следующее может или не может быть правильным - см. Редактирование ниже для более подробной информации.) Насколько я знаю, эти точные символы были просто выбраны, чтобы хорошо выглядеть, хотя может быть связь сиспользование в математике для представления некоторого произвольного оператора.
  • (Это было просто предположение - см. редактирование ниже для более надежного описания). Я думаю, <*> было выбрано, чтобы иметь хорошийрезонанс с <$>: f <$> x <*> y <*> z.Кроме того, кортежи также называются типами продуктов (например, OCaml представляет типы кортежей, такие как Int * String, что соответствует Haskell (Int, String)), поэтому может возникнуть резонанс с применением f $ (x, y, z) (не то, чтобы кто-то когда-либо делал это вместо простогоf x y z или f (x, y, z)).

РЕДАКТИРОВАТЬ: Оказывается, @chepner знал немного больше об истории, чем я - спасибо за комментарии!В оригинальной статье , в которой вводятся аппликативные функторы , для аппликативной операции использовалось имя оператора ;это был ASCII-символ как <*>.В том же документе введены <$>.Также <> может был вдохновлен <*>, поскольку моноиды и аппликативы оказываются категорически связанными.Как ни удивительно, все угловые скобки оказались связаны друг с другом!(Хотя очень косвенно и ненадежно ...)

...