* in()有特殊含义吗?

问题描述 投票:11回答:1

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

  • ($):函数应用程序运算符(允许您在函数上应用参数)
  • (&):功能应用程序运算符的翻转版本? (&) = flip ($)
  • (<>):关联运算符(你会在Semigroups和Monoids中找到它)
  • (<$>):函数应用程序($)解除了Functor结构
  • (<&>):翻转仿函数地图

我们可以在(*)(<*>)之间建立联系吗?

我真的不明白*的含义......

haskell operators naming-conventions applicative category-theory
1个回答
17
投票

这是故意的。 <*>具有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再现,后者又是的“应用”形式,理论家称之为未经证实的形式,φ。

© www.soinside.com 2019 - 2024. All rights reserved.