我正在努力扩大对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
我们可以在<>
和这个家庭<*>,<$>,<&>
之间建立链接吗?当仅查看<*>,<$>,<&>
时,我得出了一个简短的结论,即<..>
与某个结构上的某些事物相关,但是结构和关联运算符之间的联系是什么?
答案 0 :(得分:8)
这些名称并非来自某些总体概念方案。最好的方式可能是通过跟踪他们的历史记录:
McBride和Paterson的Applicative programming with effects在圆圈⊛中使用星号作为Applicative
的二进制运算符(请注意there are theoretical reasons会选择*
-例如表示产品的符号)。当Control.Applicative
made it to base(即 base -2.1 / GHC 6.6 / 2006年10月)时,它变成<*>
,据我所知,这是封闭的ASCII近似于此。
Control.Applicative
的第一个版本已包含<$>
,而我上面链接的具有效果的应用程序的最终版本也提到了它(未成年人区别在于那里的<$>
有一个Applicative
约束)。选择$
和<*>
的混搭作为fmap
运算符的目的大概是允许我们编写美观的应用程序样式表达式(f <$> u <*> v <*> w
),这些表达式可以被接受该论文中提到的成语括号(以ASCII形式呈现,类似于[| f u v w |]
)。
Monoid
类起源于 base 的历史更早(从GHC 5.04.2开始,它in a Control.Monad.Monoid
module已经存在);但是,直到4.5版(GHC 7.4,2012年初)之前, base 中没有mappend
的中缀版本。 具有效果的应用程序还提到了类人动物,并建议使用带圆圈的加号as作为mappend
的二进制运算符。据我所知,<>
是罗斯·帕特森({3}}最初提出的名称,后来被引入in a Libraries mailing list thread from 2009,并且大概也变成了preexisting GHC proposal,其{ {1}}模块最终被 base 采用。帕特森(Paterson)之所以选择Data.Semigroup
是因为它是一个中性名称,它不会建议任何特定的monoid(另请参见:Edward Kmett's semigroups package)。
答案 1 :(得分:1)
据我所知,<..>
没有 general 的含义。但是,与其他运算符肯定存在某些联系,并且列出的大多数运算符都有某种助记符的含义:
$
是函数应用程序:f $ x = f x
。 <$>
显然受到$
的启发:f $ x
将f
应用于x
,f <$> x
将f
应用于{ {1}}。 (个人,x
是我最喜欢的运算符。)<$>
和&
之间保持相同的关系。<&>
是单面附加运算符:<>
,"x" <> "y" <> "z"
。 (编辑:以下内容可能正确,也可能不正确-有关更多详细信息,请参见下面的编辑。)据我所知,那些确切的字符只是为了看起来不错而选择,尽管可能存在联系在数学中使用Sum 1 <> Sum 2 <> Sum 3
来表示任意运算符。•
与<*>
:<$>
有很好的共鸣。另外,元组也称为产品类型(例如OCaml表示类似f <$> x <*> y <*> z
的元组类型,对应于Haskell Int * String
),因此应用(Int, String)
可能会引起共鸣(不是任何人都会永远不要这样做,而不是简单地f $ (x, y, z)
或f x y z
)。 编辑:事实证明@chepner比我更了解历史-感谢您发表评论!在original paper introducing applicative functors中,运算符名称f (x, y, z)
用于应用操作;它被ASCII定义为⊛
。同一篇论文介绍了<*>
。 <$>
也可能受到<>
的启发,因为Monoid和应用程序是类别相关的。如此令人惊奇的是,所有尖括号确实相互关联! (尽管非常间接和脆弱...)