2011-06-12 29 views

回答

20

据我所知,这完全是任意的。我所知道的所有文件只是将其作为一个事实点,没有任何阐述或理由。

但是,如果你仔细想想,为什么还会有其他更好的?好吧,假设10是不够的。你有(.)这是固定性最高的,你想要其他更紧密的东西。你增加一个额外的等级,所以你的新的最大值是10(即使大多数固定值只能达到9)。

现在你有11个优先级。 (这太荒谬了,它甚至不好笑,)这是不是比10更随意?什么是阻止你添加更多?如果你想在现有的水平之间有新的水平呢?当然,你可以继续添加更多,直到最终你发现自己写作infix↑ (ω + 2i)并想知道你的生活出了什么问题。

事情是,操作符优先级本质上是一个非常随意的事情。有几个约定 - 绑定比加法更紧密的乘法事物,逻辑运算符的优先级低于布尔值函数,比如(==) - 但这些约束有限,通常不会超过几个级别。否则,记住操作符优先级的唯一方法是......呃,记住它们,就像简单地记住它们一样。这不仅是一件苦差事,它可能使代码不透明,而其他人可能没有记住所有的东西。人类的工作记忆是非常有限的资源,所以编码时需要回忆的挑剔细节越少越好。

大多数Haskell的运营商,其中优先事项分为几粗糙集团之一的用途:

  • Pseudosyntactic运营商如共同使用的($),这通常需要非常高或低优先级,以避免与其他有冲突运营商。

  • 使用标准运算符或其变体的表达式,其中存在少数标准优先级级别,并且新运算符通常应共享与基于它们的任何级别相同的级别。

  • 专门的操作员集,例如EDSL,其符号和优先级通常选择为反映EDSL的性质,并且不可能与其他操作员集合共存。

所有这些管理都很好,只有几个优先级。更重要的是,它们的特点是要么独立于其他运营商,要么只与其他运营商非常有限的一起使用。开始添加更多的操作符并将它们混合在单个表达式中,很快人们就会开始使用明确的括号,因为他们不记得什么绑定比什么更紧密。对于我自己来说,在将EDSL样式的操作符(如Arrow组合器)与逻辑操作符混合在一起时,我已经倾向于显式括号化,因为我通常不会记得每个操作符具有的确切优先级。

所以,已经确定了:1)大量额外优先级的不会是有用的,因为这太过分了跟踪,并2)我们挑选任何限制将是同样武断。 ..为什么10?我会猜测“因为固定值只有一位数”。

+3

好的答案(特别是“想知道你的生活出了什么问题”),但我认为你至少应该在一个Spinal Tap参考中被黑客入侵。 – 2011-06-12 07:45:10

+2

@mu太短:啊,那将是“大多数固定只能到9”。但是,大多数放大器都会达到10,因为摇滚音乐家倾向于从1而不是0来计数。但是范围相当。 (实际上,该段中的很多措词都是模仿Spinal Tap的线条,但这更细微) – 2011-06-12 15:38:01

+0

我想当一个人需要计算数字(加法,乘法,指数),关系运算符和逻辑运算符( &&,||)一个已经有六个级别(如果你想'a Ingo 2013-03-07 17:04:05

7

级别的数量是任意的,我记得这个决定是很多级别让人难以记住操作员如何交互。例如Prolog允许有1000个关卡,但我从未发现它比Haskell好得多。

扩展Haskell的优先级可以想象变成一个有理数,这样你总是可以在两个现有的运算符之间适合一个运算符。但更好的选择可能是切换到部分订单的优先顺序。因此,如果给两个运营商,他们可以相关,然后相应处理,或无关,这将强制括号。

+0

老实说,偏序似乎更接近我的实际想法。虽然我不确定如何处理像'($)'这样的运算符,而您只希望它“比大多数/所有其他运算符都低”。简单地说,具有独特的最大/最小优先级似乎相当不灵活。 – 2011-06-12 16:00:15

+1

@camccann我还没有看到一个令人满意的解决方案呢。所以我们坚持我们所拥有的,这比大多数语言还要好。 – augustss 2011-06-12 16:09:58

+0

噢,我希望你也能想出那个部分。 :] 好吧。现在的方式似乎与功率/复杂度比率的局部最大值非常接近。 – 2011-06-12 16:18:21