【问题标题】:meaning of `<>` in this family `<*>,<$>,<&>``<>` 在这个家族中的含义`<*>,<$>,<&>`
【发布时间】:2019-04-27 09:29:32
【问题描述】:

我正在尝试扩展我对 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

我们可以在&lt;&gt; 和这个家庭&lt;*&gt;,&lt;$&gt;,&lt;&amp;&gt; 之间建立联系吗?仅查看&lt;*&gt;,&lt;$&gt;,&lt;&amp;&gt; 时,我很快得出结论,&lt;..&gt; 与结构上的某些东西有关,但是结构和关联运算符之间的联系是什么?

【问题讨论】:

  • 我认为最好将&lt;&gt; 视为与其他&lt;...&gt; 运算符无关。 (但也许有一些我看不到的联系)
  • 我认为这是对&lt;...&gt; 本身是其他运算符上的某种运算符的想法的一种半开玩笑的引用。如果您认为&lt;x&gt; 对运算符x 执行某种常见的提升操作,那么通用关联运算符“提升”没有特定的运算符,因此&lt;...&gt;“包装”空运算符以产生&lt;&gt;
  • @chi Applicative 是(就像著名的 monad 一样)适当类别中的幺半群。 arxiv.org/abs/1406.4823 但我非常怀疑这是决定名称的理由。

标签: haskell naming-conventions category-theory monoids


【解决方案1】:

这些名称并非来自某些总体概念方案。了解这一点的最好方法是追溯他们的历史:

  • McBride 和 Paterson 的 Applicative programming with effects 使用圆圈中的星号 ⊛ 作为 Applicative 的二元运算符(请注意,there are theoretical reasons 选择类似于 * 的符号来表示产品)。当Control.Applicative made it to base(即在base-2.1/GHC 6.6/October 2006)时,它变成了&lt;*&gt;,据我所知,这是最接近的ASCII近似值。

  • Control.Applicative 的第一个版本已经以 &lt;$&gt; 为特色,我在上面链接到的 Applicative programming with effects 的最终版本也提到了它(与@ 987654336@ 有一个Applicative 约束)。选择$&lt;*&gt; 的混搭作为fmap 运算符的目的大概是允许我们编写漂亮的应用风格表达式(f &lt;$&gt; u &lt;*&gt; v &lt;*&gt; 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 的中缀版本。 带有效果的应用程序编程还提到了幺半群,并建议用带圆圈的加号 ⊕ 作为 mappend 的二元运算符。据我所知,&lt;&gt; 的名称最初是由 Ross Paterson in a Libraries mailing list thread from 2009 提出的,后来变成了 preexisting GHC proposal,大概还有 Edward Kmett's semigroups package,其 Data.Semigroup 模块最终被 基础。 Paterson 选择 &lt;&gt; 是因为它是一个中性名称,不会暗示任何特定的幺半群(另请参阅:Why is the mappend infix alias &lt;&gt; instead of +?)。

【讨论】:

  • @duplode : 关于 '' 你可以看看这个帖子:stackoverflow.com/questions/55513329/…
  • 抱歉更准确地说,&lt;*&gt; 中的* 是故意的,那么为什么&lt;&gt; 会是偶然的?它可能不是 以避免与 &lt;..&gt; 的集合混淆
  • [1/2] @NicolasHenin (1) 我想链接到你的另一个问题,但暂时忘记了。现在修好了。 (2) 在解释事物为何如此命名时,我认为仔细研究它们的历史很重要。也许 Ed Kmett 会出现在这里并纠正我说他在写 semigroups 的第一个版本时正在考虑&lt;*&gt;,但现在我没有看到存在联系的证据,除了事后的类比(这完全没问题,只要我们承认它是事后的)。
  • [2/2] @NicolasHenin 重要的是要意识到 base 或 Haskell 作为一个整体,并不是一蹴而就的,而是研究和发展交织在一起的悠久历史的结果。
  • @NicolasHenin 进一步挖掘,我发现了&lt;&gt; 名称来源的直接证据——请参阅我的最新编辑。此外,我删除了 XMonad &lt;+&gt; 示例,因为包含它会不合时宜(它的类型最初是 ManageHook -&gt; ManageHook -&gt; ManageHook;它仅在 2011 年底使用 XMonad 0.10 推广到 mappend 的类型)。
【解决方案2】:

据我所知,&lt;..&gt; 没有一般的含义。但是,与其他运算符肯定有一些联系,并且列出的大多数运算符都有某种助记符:

  • $ 是函数应用程序:f $ x = f x&lt;$&gt; 显然受到$ 的启发:而f $ xf 应用于xf &lt;$&gt; xf 应用于x 中的每个元素。 (就我个人而言,&lt;$&gt; 是我最喜欢的运营商。)
  • &amp;&lt;&amp;&gt; 之间存在相同的关系。
  • &lt;&gt; 是幺半群追加运算符:"x" &lt;&gt; "y" &lt;&gt; "z"Sum 1 &lt;&gt; Sum 2 &lt;&gt; Sum 3。 (编辑:以下内容可能正确,也可能不正确 - 有关更多详细信息,请参阅下面的编辑。)据我所知,这些确切的字符只是为了看起来不错而选择的,尽管可能存在联系在数学中使用 来表示一些任意运算符。
  • (这只是推测 - 请参阅下面的编辑以获得更可靠的帐户。)我认为选择 &lt;*&gt; 是为了与 &lt;$&gt; 产生很好的共鸣:f &lt;$&gt; x &lt;*&gt; y &lt;*&gt; z。此外,元组也被称为产品类型(例如 OCaml 表示像 Int * String 这样的元组类型,对应于 Haskell (Int, String)),因此在应用 f $ (x, y, z) 时可能会产生共鸣(并不是说任何人都会这样做而不是简单f x y zf (x, y, z))。

编辑: 原来@chepner 比我更了解历史 - 感谢您的评论!在original paper introducing applicative functors中,操作符名称用于应用操作;它是 ASCII 格式的 &lt;*&gt;。同一篇论文介绍了&lt;$&gt;&lt;&gt; 可能也受到了 &lt;*&gt; 的启发,因为 monoids 和 applicatives 被证明是绝对相关的。令人惊讶的是,所有的尖括号确实是相互关联的! (尽管非常间接和脆弱......)

【讨论】:

  • &lt;*&gt;the paper that introduced applicative functors 中使用的符号 的ASCII 表示。我不确定,但我认为同一篇论文介绍了&lt;$&gt; 作为fmap 的中缀同义词。 (它是根据pure 定义的,没有说明它与fmap 等价的证明。)
  • 哇,我不知道@chepner!我可以编辑吗?
  • 还有一个事实是应用函子是一种幺半群函子,这可能表明&lt;&gt; 是一个没有任何泛函泛音的幺半群算子。
  • @chepner 什么是幺半群函子?
  • @bradrn:关于幺半群函子:stackoverflow.com/questions/50702929/…
猜你喜欢
  • 2019-11-28
  • 1970-01-01
  • 2018-03-05
  • 2015-03-15
  • 1970-01-01
  • 1970-01-01
  • 2015-11-27
  • 2020-05-04
  • 2015-12-10
相关资源
最近更新 更多