“ <>”在这个家族中的含义“ <*>,<$>,<&>`

时间:2019-04-27 09:29:33

标签: haskell naming-conventions category-theory monoids

我正在努力扩大对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

我们可以在<>和这个家庭<*>,<$>,<&>之间建立链接吗?当仅查看<*>,<$>,<&>时,我得出了一个简短的结论,即<..>与某个结构上的某些事物相关,但是结构和关联运算符之间的联系是什么?

2 个答案:

答案 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 $ xf应用于xf <$> xf应用于{ {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和应用程序是类别相关的。如此令人惊奇的是,所有尖括号确实相互关联! (尽管非常间接和脆弱...)