[haskell]函数复合有点模糊
本帖最后由 retuor 于 2010-07-17 15:07 编辑
Prelude> length.reverse [1,2,3]
<interactive>:1:7:
Couldn't match expected type `a -> [a1]'
against inferred type `[t]'
In the second argument of `(.)', namely `reverse [1, 2, 3]'
In the expression: length . reverse [1, 2, 3]
In the definition of `it': it = length . reverse [1, 2, 3]
Prelude> length.reverse $ [1,2,3]
3
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
原来这个叫函数复合 ……
洁癖都用$
length $ reverse $ [1,2,3]
(((.) length) reverse) [1,2,3],呵呵.
打字洁癖症患者是怎么样的,能治么?
函数应用的优先级最高
length . reverse [1,2,3] 等同于 length . ( reverse [1,2,3] )
而 (.) length reverse [1,2,3] 等同于 ( (.) length reverse ) [1,2,3]
注意函数应用是左结合的。
试了下
复制代码我想应该就是这么回事。。。 加了()之后的运算符就成了真正的函数。
运算符和函数有细微的区别, 至少运算符都有 infixr xxoo 或者 infixl xxoo这个属性
本帖最后由 SNYH 于 2010-07-17 22:46 编辑
函数的优先级比 (.)运算符 要高
所以 reverse 会先应用到 [1,2,3] 上
但写成 (.) length reverse 的时候 . 就是一个函数 而不是运算符了
纯猜想
ps: 函数是left-associative
. infixr 9
我没找到函数的优先级是多少之找到这句话
但 (.) length reverse [1,2,3] 的时候,是按 (length . reverse) [1,2,3] 来算的。放前面和放中间优先级不一样吗?
因为 优先级
这个在所有的语言里面貌似都是通用的吧
一般是这样写的 length . reverse $ [1,2,3]
为什么 (.) length reverse [1,2,3] 可以,而 length . reverse [1,2,3] 时,haskell 会把整个 reverse [1,2,3] 作为第二个参数呢?