(<*>)中的*是否具有特殊含义?

Nic*_*nin 11 haskell naming-conventions operators category-theory applicative

试图扩大我对Haskell中符号的理解:

  • ($) :函数应用程序运算符(允许您在函数上应用参数)
  • (&) :功能应用程序运算符的翻转版本? (&) = flip ($)
  • (<>) :关联运算符(您可以在半群和Monoid中找到它)
  • (<$>):将功能应用程序($)移到函子结构上
  • (<&>) :翻转的函子图

我们可以在(*)和之间建立链接(<*>)吗?

我不明白的意思*实际上是...

lef*_*out 17

这是故意的。<*>具有张量积的特征。这在列表monad中最好地看到:

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)]
Run Code Online (Sandbox Code Playgroud)

更一般地,应用函子(aka 单项函子)从函子后面的两个对象(即产品类型,aka元组或通过引入两个函数参数)的乘积映射到函子之前的乘积结果。因此,这确实是一个相当不错的产品操作。

ABFAFBFAB

...在Haskell,

? :: (f a, f b) -> f (a,b)
? = uncurry (liftA2 (,))
-- recall `liftA2 f x y = f <$> x <*> y`
Run Code Online (Sandbox Code Playgroud)

甚至

{-# LANGUAGE TypeOperators #-}
type x ? y = (x,y)

? :: f a ? f b -> f (a?b)
Run Code Online (Sandbox Code Playgroud)

要了解历史方面,请查看McBride和Paterson 2008(doi:10.1017 / S0956796807006326),这是第一个介绍Applicative类型类的论文。他们注意到

Applicative类具有非对称运算功能?,但是有一个等效的对称定义。

class Functor f -> Monoidal f where
    unit :: f ()
    (?) :: f a -> f b -> f (a,b)
Run Code Online (Sandbox Code Playgroud)

显然,这些操作对于任何应用函数都可以定义。

因此,<*>是McBride和Paterson的?运算符的ASCII表示形式,?而后者又是类别理论家以“未简化”形式称为“专有化”形式的类别。