(<*>) 中的 * 有特殊含义吗?

Does * in (<*>) have a special meaning?

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

我们可以在 (*)(<*>) 之间做一个 link 吗?

其实我没看懂*的意思...

这是故意的。 <*> 具有 tensor product 的特征。这最好在列表 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)]

更一般地,应用仿函数(又名 monoidal functors)映射自两个对象(即产品类型,又名元组或通过柯里化 两个函数参数)的乘积函子到函子之前乘积的函子结果。所以这确实是一个非常产品化的操作。

φA,B: F AF BF(AB)

...在 Haskell,

φ :: (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 类型类的论文。他们注意到

The Applicative class features the asymmetrical operation , but there is an equivalent symmetrical definition.

class Functor f -> Monoidal f where
    unit :: f ()
    (★) :: f a -> f b -> f (a,b)

These operations are clearly definable for any Applicative functor...

因此,<*> 是 McBride 和 Paterson 的 运算符的 ASCII 版本,它又是 的“应用化”形式,范畴理论家称之为,在未柯里化形式,φ.