对Haskell来说是个新手,我在这个表达式中碰到了一个简单的错误。
matches !! length . count不能混合!内嵌9和'.‘。在相同的infix表达式中插入9
这让我感到惊讶--为什么这些运营商都有先见之明?是什么阻止了Haskell的设计师以比(!!)更高的优先级创建(!!)?
我无法想象这仅仅是被忽略了,所以我假设这里有一个理由,我错过了。
Note I认识到,将(!!)应用于由(.)组成的函数在编译时仍然会导致错误。我很好奇为什么Haskell的设计方式允许这种意外的错误消息。
发布于 2016-12-04 23:49:02
我去挖了。可能没有韵律或理由的两个前缀操作符具有相同的优先权。在1990年发布的Haskell1.0报告中,(!!)操作符出现在PreludeList.hs文件中,(.)操作符位于Prelude.hs文件中。因为它们处理的是完全不同的事情(函数组合和列表索引),而且它们位于完全不同的文件中,所以它们很可能没有交叉协调。
此外,报告中很少提到“前奏曲”中的这些职能。(.)只是在一个队列中作为组合函数被提到,而在实际源文件之外根本没有提到(!!)。
这样做的原因应该或多或少是显而易见的。前奏曲是有用的,但这不是Haskell开发出来的原因,也不是语言设计中困难而有趣的部分。Haskell更多的是关于lambda微积分和范畴理论,而不是列表索引。所以一点也不奇怪,没有太多的思考(或者至少没有很多文档!)进入了各种操作符的优先顺序。
发布于 2016-12-04 23:48:40
哈斯克尔有很多操作员。正在运行
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)因此,没有真正的空间来区分!!和.的优先级。而且,我不认为.或!!都有更高的优先级的先例。
https://stackoverflow.com/questions/40964583
复制相似问题