我想知道为什么Haskell设计师同意只允许10级优先级?有人发现它不足吗?为什么Haskell优先级只有10个级别?足够的数字?
回答
据我所知,这完全是任意的。我所知道的所有文件只是将其作为一个事实点,没有任何阐述或理由。
但是,如果你仔细想想,为什么还会有其他更好的?好吧,假设10是不够的。你有(.)
这是固定性最高的,你想要其他更紧密的东西。你增加一个额外的等级,所以你的新的最大值是10(即使大多数固定值只能达到9)。
现在你有11个优先级。 (这太荒谬了,它甚至不好笑,)这是不是比10更随意?什么是阻止你添加更多?如果你想在现有的水平之间有新的水平呢?当然,你可以继续添加更多,直到最终你发现自己写作infix↑ (ω + 2i)
并想知道你的生活出了什么问题。
事情是,操作符优先级本质上是一个非常随意的事情。有几个约定 - 绑定比加法更紧密的乘法事物,逻辑运算符的优先级低于布尔值函数,比如(==)
- 但这些约束有限,通常不会超过几个级别。否则,记住操作符优先级的唯一方法是......呃,记住它们,就像简单地记住它们一样。这不仅是一件苦差事,它可能使代码不透明,而其他人可能没有记住所有的东西。人类的工作记忆是非常有限的资源,所以编码时需要回忆的挑剔细节越少越好。
大多数Haskell的运营商,其中优先事项分为几粗糙集团之一的用途:
Pseudosyntactic运营商如共同使用的
($)
,这通常需要非常高或低优先级,以避免与其他有冲突运营商。使用标准运算符或其变体的表达式,其中存在少数标准优先级级别,并且新运算符通常应共享与基于它们的任何级别相同的级别。
专门的操作员集,例如EDSL,其符号和优先级通常选择为反映EDSL的性质,并且不可能与其他操作员集合共存。
所有这些管理都很好,只有几个优先级。更重要的是,它们的特点是要么独立于其他运营商,要么只与其他运营商非常有限的一起使用。开始添加更多的操作符并将它们混合在单个表达式中,很快人们就会开始使用明确的括号,因为他们不记得什么绑定比什么更紧密。对于我自己来说,在将EDSL样式的操作符(如Arrow
组合器)与逻辑操作符混合在一起时,我已经倾向于显式括号化,因为我通常不会记得每个操作符具有的确切优先级。
所以,已经确定了:1)大量额外优先级的不会是有用的,因为这太过分了跟踪,并2)我们挑选任何限制将是同样武断。 ..为什么10?我会猜测“因为固定值只有一位数”。
好的答案(特别是“想知道你的生活出了什么问题”),但我认为你至少应该在一个Spinal Tap参考中被黑客入侵。 – 2011-06-12 07:45:10
@mu太短:啊,那将是“大多数固定只能到9”。但是,大多数放大器都会达到10,因为摇滚音乐家倾向于从1而不是0来计数。但是范围相当。 (实际上,该段中的很多措词都是模仿Spinal Tap的线条,但这更细微) – 2011-06-12 15:38:01
我想当一个人需要计算数字(加法,乘法,指数),关系运算符和逻辑运算符( &&,||)一个已经有六个级别(如果你想'a Ingo 2013-03-07 17:04:05
级别的数量是任意的,我记得这个决定是很多级别让人难以记住操作员如何交互。例如Prolog允许有1000个关卡,但我从未发现它比Haskell好得多。
扩展Haskell的优先级可以想象变成一个有理数,这样你总是可以在两个现有的运算符之间适合一个运算符。但更好的选择可能是切换到部分订单的优先顺序。因此,如果给两个运营商,他们可以相关,然后相应处理,或无关,这将强制括号。
老实说,偏序似乎更接近我的实际想法。虽然我不确定如何处理像'($)'这样的运算符,而您只希望它“比大多数/所有其他运算符都低”。简单地说,具有独特的最大/最小优先级似乎相当不灵活。 – 2011-06-12 16:00:15
@camccann我还没有看到一个令人满意的解决方案呢。所以我们坚持我们所拥有的,这比大多数语言还要好。 – augustss 2011-06-12 16:09:58
噢,我希望你也能想出那个部分。 :] 好吧。现在的方式似乎与功率/复杂度比率的局部最大值非常接近。 – 2011-06-12 16:18:21
- 1. 优先级和优先级
- 2. 这两个优先级队列包装器有什么区别?
- 3. Haskell中缀函数应用优先级
- 4. 具有两个优先级的优先级队列Python
- 5. 优先级队列中的优先级
- 6. 在linux下,pthread优先级与lwp优先级有什么关系?
- 7. Haskell中的运算符优先级
- 8. 操作的优先级在Haskell
- 9. 两个类别之间的优先级
- 10. MLFQ的优先级是什么?
- 11. JavaScript执行的优先级是什么?
- 12. Haskell优先级:Lambda和运算符
- 13. Haskell类型运算符优先级
- 14. 具有动态项目优先级的优先级队列
- 15. Spring事务隔离级别vs数据库隔离级别的优先级
- 16. 为什么在Perl中没有相当于//的低优先级?
- 17. 为什么Mercurial只有一个级别的回滚?
- 18. C++函数中非常奇怪的优先级/优先级
- 19. 优先级队列的优先级总是需要是整数?
- 20. Linux内核中使用的三个优先级之间有什么区别?
- 21. 优先上传优先级,以高优先级使用HTB qdiscs
- 22. 优先级
- 23. 为什么最大优先级队列没有DECREASE KEY?
- 24. “实际上”足够的数据库规范化级别是什么?
- 25. 为什么域名空间树只能有128个级别?
- 26. D上的优化级别是什么?
- 27. 为什么此优先级队列实现只重复打印一个值?
- 28. 为什么这个工作优先级=''-1在mysql中
- 29. 这个优先级队列逻辑java有什么问题?
- 30. MySQL的优先级
添加第11级会产生副作用O.o – 2011-06-12 05:58:46
因为Nigel Tufnel不知道Haskell。 – 2011-06-12 06:00:08