(<*>) 中的 * 有特殊含义吗?
Does * in (<*>) have a special meaning?
试图扩展我对 Haskell 中符号的理解:
($)
:函数应用运算符(允许您对函数应用参数)
(&)
: 函数应用运算符的翻转版本? (&) = flip ($)
(<>)
: 结合运算符(你会在半群和幺半群中找到它)
(<$>)
: 函数应用程序 ($)
提升到 Functor 结构
(<&>)
: 翻转仿函数映射
我们可以在 (*)
和 (<*>)
之间做一个 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 A ∙ F B → F(A⊗B)
...在 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 版本,它又是 ★
的“应用化”形式,范畴理论家称之为,在未柯里化形式,φ.
试图扩展我对 Haskell 中符号的理解:
($)
:函数应用运算符(允许您对函数应用参数)(&)
: 函数应用运算符的翻转版本?(&) = flip ($)
(<>)
: 结合运算符(你会在半群和幺半群中找到它)(<$>)
: 函数应用程序($)
提升到 Functor 结构(<&>)
: 翻转仿函数映射
我们可以在 (*)
和 (<*>)
之间做一个 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 A ∙ F B → F(A⊗B)
...在 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 版本,它又是 ★
的“应用化”形式,范畴理论家称之为,在未柯里化形式,φ.