为什么(!!)和(。)共享优先级9?

时间:2016-12-04 22:41:19

标签: haskell

Haskell的新手,我在这段表达式上遇到了一个简单的错误

matches !! length . count
  

无法混合'!!' [infixl 9]和'。' [infixr 9]在相同的中缀表达式

这令我感到惊讶 - 为什么这些运营商会分享优势呢?是什么阻止了Haskell的设计者以比(.)更高的优势建立(!!)

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

注意我意识到将(!!)应用于由(.)组成的函数仍然会在编译时导致错误。我很好奇为什么Haskell的设计方式允许出现这种意外的错误消息。

2 个答案:

答案 0 :(得分:11)

我去挖了。两个中缀运算符具有相同的优先级可能没有押韵或理由。在1990年发布的Haskell 1.0报告中,在PreludeList.hs文件中找到了(!!)运算符,而(.)运算符在Prelude.hs文件中。因为它们处理完全不同的事物(函数组合与列表索引),并且它们处于完全不同的文件中,所以它们很可能不是交叉协调的。

此外,在报告中,几乎没有提到前奏中的这些功能。 (.)刚刚在单行中提到作为组合函数,并且在实际源文件之外根本没有提到(!!)

这个原因应该或多或少显而易见。 Prelude很有用,但这并不是Haskell开发的原因,也不是语言设计的难点,有趣的部分。 Haskell更多关于lambda演算和类别理论而不是列表索引。因此,不是很多想法(或者至少没有很多文档!)进入各种运算符的优先级并不奇怪。

答案 1 :(得分: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)
  • .应该高于几乎所有东西(固定性9)

因此,没有真正的空间来区分!!.的优先级。此外,我认为预计.!!具有更高优先级的先例并不多。