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演算和类别理论而不是列表索引.因此,不是很多想法(或者至少没有很多文档!)进入各种运算符的优先级并不奇怪.
Haskell有很多运营商.运行
grep -hor '^infix[lr]\{0,1\} .*$' ghc/libraries/ | sort -u
Run Code Online (Sandbox Code Playgroud)
在我的GHC头脑里,我找回了137个操作员.不太所有这些被曝光,但仍:因为优先必需介于0和9包容性,冲突是不可避免的.
$ 应该低于几乎所有东西(固定0)>>=应该高于$(固定1)||应该高于>>=(固定2)&&应该高于||(固定3)==应该高于&&(固定4)++应该高于==(固定5)+应该高于++(固定性6)*应该高于+(固定7)^应该高于*(固定性8)!!应该高于^(固定9). 应该高于几乎所有东西(固定9)因此,有没有真正的空间来区分的优先级!!和..此外,我不认为有任何先例.或!!预期会有更高的优先权.