首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么(!!)和(.)共享优先9?

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

Stack Overflow用户
提问于 2016-12-04 22:41:19
回答 2查看 339关注 0票数 4

对Haskell来说是个新手,我在这个表达式中碰到了一个简单的错误。

代码语言:javascript
复制
matches !! length . count

不能混合!内嵌9和'.‘。在相同的infix表达式中插入9

这让我感到惊讶--为什么这些运营商都有先见之明?是什么阻止了Haskell的设计师以比(!!)更高的优先级创建(!!)

我无法想象这仅仅是被忽略了,所以我假设这里有一个理由,我错过了。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-04 23:49:02

我去挖了。可能没有韵律或理由的两个前缀操作符具有相同的优先权。在1990年发布的Haskell1.0报告中,(!!)操作符出现在PreludeList.hs文件中,(.)操作符位于Prelude.hs文件中。因为它们处理的是完全不同的事情(函数组合和列表索引),而且它们位于完全不同的文件中,所以它们很可能没有交叉协调。

此外,报告中很少提到“前奏曲”中的这些职能。(.)只是在一个队列中作为组合函数被提到,而在实际源文件之外根本没有提到(!!)

这样做的原因应该或多或少是显而易见的。前奏曲是有用的,但这不是Haskell开发出来的原因,也不是语言设计中困难而有趣的部分。Haskell更多的是关于lambda微积分和范畴理论,而不是列表索引。所以一点也不奇怪,没有太多的思考(或者至少没有很多文档!)进入了各种操作符的优先顺序。

票数 11
EN

Stack Overflow用户

发布于 2016-12-04 23:48:40

哈斯克尔有很多操作员。正在运行

代码语言:javascript
复制
grep -hor '^infix[lr]\{0,1\} .*$' ghc/libraries/ | sort -u

在我的GHC头里,我得到了137名操作员。并非所有这些都是公开的,但仍然是:由于优先级必须在09包容性之间,冲突是不可避免的。

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

因此,没有真正的空间来区分!!.的优先级。而且,我不认为.!!都有更高的优先级的先例。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40964583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档