Haskell的新手,我在这段表达式上遇到了一个简单的错误
matches !! length . count
无法混合'!!' [infixl 9]和'。' [infixr 9]在相同的中缀表达式
这令我感到惊讶 - 为什么这些运营商会分享优势呢?是什么阻止了Haskell的设计者以比(.)
更高的优势建立(!!)
?
我无法想象这只是被忽视了,所以我认为这里有一个理由我错过了。
注意我意识到将(!!)
应用于由(.)
组成的函数仍然会在编译时导致错误。我很好奇为什么Haskell的设计方式允许出现这种意外的错误消息。
答案 0 :(得分:11)
(!!)
运算符,而(.)
运算符在Prelude.hs文件中。因为它们处理完全不同的事物(函数组合与列表索引),并且它们处于完全不同的文件中,所以它们很可能不是交叉协调的。
此外,在报告中,几乎没有提到前奏中的这些功能。 (.)
刚刚在单行中提到作为组合函数,并且在实际源文件之外根本没有提到(!!)
。
这个原因应该或多或少显而易见。 Prelude很有用,但这并不是Haskell开发的原因,也不是语言设计的难点,有趣的部分。 Haskell更多关于lambda演算和类别理论而不是列表索引。因此,不是很多想法(或者至少没有很多文档!)进入各种运算符的优先级并不奇怪。
答案 1 :(得分:8)
Haskell有很多运营商。运行
grep -hor '^infix[lr]\{0,1\} .*$' ghc/libraries/ | sort -u
在我的GHC主管内部,我找回了137名操作员。并非所有这些都暴露出来,但仍然是:由于优先级必须介于0
和9
之间,因此冲突是不可避免的。
$
应该低于几乎所有东西(固定0)>>=
应高于$
(固定1)||
应高于>>=
(固定性2)&&
应高于||
(固定3)==
应高于&&
(固定4)++
应高于==
(固定5)+
应高于++
(固定6)*
应高于+
(固定7)^
应高于*
(固定8)!!
应高于^
(固定9).
应该高于几乎所有东西(固定性9)因此,没有真正的空间来区分!!
和.
的优先级。此外,我认为预计.
或!!
具有更高优先级的先例并不多。