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

Mat*_*att 4 haskell

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

matches !! length . count
Run Code Online (Sandbox Code Playgroud)

不能混合'!!' [infixl 9]和'.' [infixr 9]在相同的中缀表达式中

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

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

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

Omn*_*ity 11

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

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

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


Ale*_*lec 8

Haskell有很多运营商.运行

grep -hor '^infix[lr]\{0,1\} .*$' ghc/libraries/ | sort -u
Run Code Online (Sandbox Code Playgroud)

在我的GHC头脑里,我找回了137个操作员.不太所有这些被曝光,但仍:因为优先必需介于09包容性,冲突是不可避免的.

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

因此,有没有真正的空间来区分的优先级!!..此外,我不认为有任何先例.!!预期会有更高的优先权.

  • 没有先例可以拥有更高的优先权,但是对于`!!`而言,它具有更高的优先级肯定更有意义.既不是`(a.b)!! c`也不是'a !! (b.c)`有希望通过类型检查器,但是`a.(b !! c)`和`(a !! b).c`都可能有效. (5认同)