我正在尝试扩展我对Haskell中符号的理解:
$ : Function Application operator (Allow you to apply arguments over a function)
& : flipped version of Function Application Operator? (&) = flip ($)
<> : associative operator (You'll find it in Semigroups and Monoids)
<$> : function application ($) lifted over a Functor structure
<&> : flipped functor map
<*> : applicative operator
我们可以在<>
和这个家庭<*>,<$>,<&>
之间建立联系吗?当我只看<*>,<$>,<&>
<..>
与结构上的某些东西有关时,我做了一个快速的结论,但那么结构和关联算子之间的联系是什么?
这些名称并非来自某些总体概念方案。看到这一点的最好方法是追踪他们的历史:
Applicative
的二元运算符(请注意there are theoretical reasons选择一个*
样符号来表示产品)。当Control.Applicative
made it to base(即基地-2.1 / GHC 6.6 / 2006年10月)成为<*>
时,据我所知,这是最接近的ASCII近似值。Control.Applicative
的第一个版本已经以<$>
为特色,应用程序编程的最终版本与我上面链接的效果也提到了它(与<$>
有一个Applicative
约束的微小差别)。选择$
和<*>
混搭作为fmap
运算符的观点可能允许我们编写漂亮的应用样式表达式(f <$> u <*> v <*> w
),这些表达式可以替代该论文中提到的成语括号(以ASCII格式呈现,像[| f u v w |]
)。Monoid
类在基地历史上更早出现(它已经存在于GHC 5.04.2,in a Control.Monad.Monoid
module);然而,直到版本4.5(GHC 7.4,2012年初),在基础上没有mappend
的中缀版本。带有效果的应用程序设计也提到了幺半群,并建议使用带圆圈的加号⊕作为mappend
的二元运算符。据我所知,<>
的名字最初由Ross Paterson in a Libraries mailing list thread from 2009提出,并且进入了preexisting GHC proposal,并且可能也是Edward Kmett's semigroups package,其Data.Semigroup
模块最终被基地采用。帕特森选择<>
作为一个中性名称,这不会暗示任何特定的幺半群(参见:Why is the mappend
infix alias <>
instead of +
?)。据我所知,<..>
没有一般意义。但是,肯定与其他运营商有一些联系,大多数列出的运营商都有某种助记符含义:
$
是功能应用:f $ x = f x
。 <$>
明显受到$
的启发:f $ x
将f
应用于x
,f <$> x
将f
应用于x
内的每个元素。 (就个人而言,<$>
是我最喜欢的运营商。)&
和<&>
之间存在同样的关系。<>
是幺正附加算子:"x" <> "y" <> "z"
,Sum 1 <> Sum 2 <> Sum 3
。 (编辑:以下可能也可能不正确 - 请参阅下面的编辑以获取更多详细信息。)据我所知,这些确切的字符只是选择看起来不错,尽管可能与•
在数学中的使用有关代表一些任意的运算符。<*>
被选中与<$>
有很好的共鸣:f <$> x <*> y <*> z
。另外元组也被称为产品类型(例如OCaml代表元组类型,如Int * String
,对应于Haskell (Int, String)
),因此可能存在应用f $ (x, y, z)
的共振(并不是任何人都会这样做而不是普通的f x y z
或f (x, y, z)
)。编辑:事实证明@chepner比我更了解历史 - 感谢评论!在original paper introducing applicative functors中,运营商名称⊛
用于应用操作;这是ASCII-fied为<*>
。同一篇论文介绍了<$>
。 <>
也可能受到<*>
的启发,因为monoids和applicatives被证明是相关的。令人惊讶的是,所有倾斜的支架确实与彼此相关! (虽然非常间接和非常......)