haskell - 为什么 Haskell 优先级只有 10 个级别? 10的数字够吗?

标签 haskell operator-precedence

我想知道为什么 Haskell 设计者同意只允许 10 级优先级?有没有人觉得不够?

最佳答案

据我所知,这完全是任意的。我所知道的所有文档都只是将其陈述为事实,没有详细说明或证明。

但如果你仔细想想,为什么还有其他更好的呢?好吧,假设 10 是不够的。你有 (.)它具有最高的固定性,并且您想要其他结合得更紧密的东西。您添加了一个额外的级别,因此您的新最大值为 10(即使大多数固定性仅达到 9)。

现在您有 11 级优先级。 (这太 absurd 了。这甚至都不好笑。)这怎么比 10 更随意?是什么阻止您添加更多内容?如果您想在现有关卡之间增加新关卡怎么办?当然,您可以继续添加更多内容,直到最终您发现自己正在编写 infix↑ (ω + 2i)想知道你的生活哪里出了问题。

问题是,运算符优先级本质上是一个非常随意的事情。有一些约定——乘法的东西比加法的东西绑定(bind)得更紧密,逻辑运算符的优先级低于 bool 值函数,如 (==) ——但这些都有一定的限制,通常不会超过几个级别。否则,记住运算符优先级的唯一方法是……嗯,记住它们,就像简单地记住每一个一样。这不仅是一件苦差事,而且对于可能没有记住所有内容的其他人来说,它会使代码变得不透明。人类工作内存是一种非常有限的资源,因此在编码时需要记忆的挑剔细节越少越好。

在 Haskell 中,优先级很重要的运算符的大多数用途属于几个粗略的组之一:

  • 伪句法运算符,如 ($) 的常见用法,通常需要极高或极低的优先级以避免与其他运算符冲突。
  • 使用标准运算符或其变体的表达式,其中存在少数标准优先级,并且新运算符通常应与其所基于的任何内容共享相同的级别。
  • 专门的运营商集,例如 EDSL,其符号和优先级通常被选择以反射(reflect) EDSL 的性质,并且不太可能与其他运营商集共存。

  • 所有这些都管理得很好,只有几个优先级。更重要的是,它们的特点是要么有效地独立于其他运算符,要么仅与非常有限的一组其他运算符一起使用。开始添加更多运算符并将它们混合在单个表达式中,很快人们就会开始使用显式括号,因为他们不记得什么比什么绑定(bind)得更紧密。就我自己而言,在将 EDSL 风格的运算符(例如,Arrow 组合子)与逻辑运算符混合时,我已经很容易出现显式括号,因为我通常记不起每个运算符的确切优先级。

    因此,已经确定: 1) 许多额外的优先级不会那么有用,因为它太多了,无法跟踪, 2) 我们选择的任何限制都将是同样任意的……为什么是 10?我会猜测“因为固定值只是个位数”。

    关于haskell - 为什么 Haskell 优先级只有 10 个级别? 10的数字够吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6320424/

    相关文章:

    haskell - 无法安装 wx

    c++ - 构造函数的初始化列表中的函数调用是否按顺序排列?

    c++ - 成员函数的链式调用 - 调用顺序

    c++ - 在 C++ 中建模类型类

    haskell - 如何设置列表的范围?

    csv - 从 CSV 解析嵌套数据

    function - Haskell 映射和过滤器

    javascript - C# 与 Javascript 中的算术顺序

    带有整数枚举器的 Python bool 运算符成员资格测试

    关于 C 中运算符优先级的困惑