2016-12-04 103 views
4

新来的Haskell,我在这片表达式的为什么(!!)和(。)共享优先级9?

matches !! length . count 

不能混合打一个简单的错误“!!” [infixl 9]和'。' [infixr 9] in the infixr表达式

这让我感到惊讶 - 为什么这些运营商会有优先权?什么阻止了Haskell的设计者在以上的优先级比(!!)

我无法想象这只是被忽视,所以我认为这里有一个理由,我失踪了。

注意我认识到,应用(!!)到由(.)组成的功能仍然会导致在编译时错误。我很好奇为什么Haskell的设计方式允许出现这个意外的错误信息。

+4

为什么你会想到'.'有比'的优先级高!!',而不是周围的其他方式? – melpomene

+3

我不确定在这个特定的冲突背后是否有理由。只有“十级”的优先级,一些冲突必然会发生。 – duplode

+3

@duplode,十个优先级的选择是坦率的离奇。我希望在等价关系下有更像偏序的东西,从而允许运算符对任意其他运算符的优先级更高,更低或相等。但我想设计师并不想为此设计一个真正复杂的系统。 – dfeuer

回答

11

我去挖掘。两个中缀运营商可能没有相同优先顺序的韵律或理由。在Haskell 1中。0报告,于1990年发布,在(!!)运营商在PreludeList.hs文件被发现,(.)经营者在Prelude.hs文件。因为它们处理完全不同的事情(函数组合与列表索引),并且它们处于完全不同的文件中,所以它们很可能不是交叉协调的。

此外,报告内,在前奏这些函数几乎没有提到。 (.)在一个衬垫刚才提到作为组合物的功能和(!!)未在实际的源文件的所有外提及。

其原因应该是或多或少明显。 Prelude是有用的,但这不是Haskell开发的原因,它不是语言设计中很难,有趣的部分。哈斯克尔更多地是关于lambda微积分和类别理论,而不是列表索引。所以没有多少想法(或者至少不是很多文档!)进入到各种运营商的优先顺序中并不奇怪。

+0

这提供了我正在寻找的宣泄,感谢您的挖掘! – Matt

8

Haskell有很多运营商。运行

grep -hor '^infix[lr]\{0,1\} .*$' ghc/libraries/ | sort -u 

我的GHC头里面我找回137个运营商。并非所有这些都是暴露的,但仍然是:因为优先级必须介于09之间,冲突是不可避免的。

  • $应该比几乎所有(固定性0)
  • >>=应该比$(固定性1)
  • ||应该比>>=更高(固定性2)更高下
  • &&应高于||(固定3)
  • ==应该高于&&(固定4)
  • ++应高于==(固定性5)
  • +应该比++(固定性6)
  • *应该比+更高(固定性7)更高
  • ^应该比*更高(固定性8)
  • !!应该比^(固定性9)
  • .应高于p更高retty很多东西(固定9)

所以没有真正的空间来区分!!.的优先顺序。另外,我认为.!!预计会有更高的优先顺序,这是没有太多先例的。

+5

要么有更高的优先级,没有先例,但''''具有更高的优先级肯定更有意义。 “(a。b)!不''! (b。c)'有希望通过类型检查器,但'a。 (b !! c)'和'(a !! b)。 c'都可能是有效的。 – dfeuer

+1

这是有趣的,虽然,'>> ='本来是一个后来除了层次,没有它会有余地'.'具有比'低优先级!'。尽管(假设固定性6条目应该提及'++'而不是'++'),我想不出为什么'++'应该高于或低于'+'。 – chepner

+0

@dfeuer,哦,这很有趣。这里可能有一些原则。具有特定返回类型的运算符应该比具有更一般返回类型的运算符更低优先级,或者类似的东西。 – luqui