免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7940 | 回复: 11
打印 上一主题 下一主题

[haskell]函数复合有点模糊 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-07-16 16:43 |只看该作者 |倒序浏览
本帖最后由 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

论坛徽章:
0
2 [报告]
发表于 2010-07-17 15:10 |只看该作者
为什么 (.) length reverse [1,2,3] 可以,而 length . reverse [1,2,3] 时,haskell 会把整个 reverse [1,2,3] 作为第二个参数呢?

论坛徽章:
0
3 [报告]
发表于 2010-07-17 18:50 |只看该作者
因为 优先级
  这个在所有的语言里面貌似都是通用的吧

一般是这样写的 length . reverse $ [1,2,3]

论坛徽章:
0
4 [报告]
发表于 2010-07-17 18:57 |只看该作者
但 (.) length reverse [1,2,3] 的时候,是按 (length . reverse) [1,2,3] 来算的。放前面和放中间优先级不一样吗?

论坛徽章:
0
5 [报告]
发表于 2010-07-17 19:02 |只看该作者
本帖最后由 SNYH 于 2010-07-17 22:46 编辑

函数的优先级比  (.)运算符  要高
所以 reverse 会先应用到 [1,2,3] 上

但写成 (.) length reverse 的时候 . 就是一个函数 而不是运算符了

纯猜想
ps: 函数是left-associative

.  infixr 9

我没找到函数的优先级是多少之找到这句话
Whereas normal function application (putting a space between two things) has a really high precedence,....

论坛徽章:
0
6 [报告]
发表于 2010-07-17 22:52 |只看该作者
试了下

  1. Prelude> 1 + 2 * 3
  2. 7
  3. Prelude> (+) 1 2 * 3
  4. 9
复制代码
我想应该就是这么回事。。。   加了()之后的运算符就成了真正的函数。
运算符和函数有细微的区别,  至少运算符都有  infixr xxoo 或者 infixl xxoo这个属性

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2010-07-19 13:19 |只看该作者
函数应用的优先级最高

length . reverse [1,2,3] 等同于 length . ( reverse [1,2,3] )
而 (.) length reverse [1,2,3] 等同于 ( (.) length  reverse ) [1,2,3]

注意函数应用是左结合的。

论坛徽章:
0
8 [报告]
发表于 2010-07-19 18:18 |只看该作者
(((.) length) reverse) [1,2,3],呵呵.

打字洁癖症患者是怎么样的,能治么?

论坛徽章:
0
9 [报告]
发表于 2010-07-20 17:20 |只看该作者
洁癖都用$
length $ reverse $ [1,2,3]

论坛徽章:
0
10 [报告]
发表于 2010-07-21 05:16 |只看该作者
原来这个叫函数复合 ……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP