试图扩展我对Haskell中符号的理解:
($)
:函数应用程序运算符(允许您在函数上应用参数)(&)
:功能应用程序运算符的翻转版本? (&) = flip ($)
(<>)
:关联运算符(你会在Semigroups和Monoids中找到它)(<$>)
:函数应用程序($)
解除了Functor结构(<&>)
:翻转仿函数地图我们可以在(*)
和(<*>)
之间建立联系吗?
我真的不明白*
的含义......
这是故意的。 <*>
具有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)]
更一般地,applicative functors(aka monoidal functors)从functor后面的两个对象(即产品类型,也就是元组或通过currying两个函数参数)的产品映射到functor之前的产品的functor-result。所以这确实是一个非常好的产品。
φA,B:F A∙F B→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 functor都可以明确定义这些操作......
因此,<*>
是麦克布赖德和帕特森的⊛
算子的ASCII再现,后者又是★
的“应用”形式,理论家称之为未经证实的形式,φ。