免费注册 查看新帖 |

Chinaunix

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

partial function 也可以这样用(infix的) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-02 16:00 |只看该作者 |倒序浏览
我们通常写代码是这样写的:

  1. add2 x = x + 2

  2. mySum xs = foldr (+) 0 xs
复制代码

但 partial function 为我们提供了一个简写的方法
例如:

  1. add2 = (+2)

  2. mySum = foldr (+) 0
复制代码

上面的 "(+2)" 和 "foldr (+) 0" 就是 partial function

  1. Main> :t add2
  2. add2 :: Integer -> Integer
  3. Main> :t mySum
  4. mySum :: [Integer] -> Integer
  5. Main> :t (+2)
  6. flip (+) 2 :: Num a => a -> a
  7. Main> :t foldr (+) 0
  8. foldr (+) 0 :: Num a => [a] -> a
复制代码


这里的 (+2) 很特殊,也可以写为 (2+)

原来一直以为只有 + - * / ^ 等这几个运算符可以这样,没想到下面也可以
可以试试这一个:

  1. eachBy = (`map` [1, 2, 3, 4])
  2. addEach2To = ((+2) `map`)
复制代码

  1. Main> eachBy (+2)
  2. [3,4,5,6]
  3. Main> addEach2To [1, 2, 3, 4]
  4. [3,4,5,6]
复制代码

infix 函数 partial function 有两种形式,一种与第一个参数结合,另一种是与与第二个参数结合

[ 本帖最后由 izhier 于 2009-4-2 16:02 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2009-04-02 16:03 |只看该作者
(+2) 和 (2+) 一样是因为加法符合交换律,不然还是有区别的。

论坛徽章:
0
3 [报告]
发表于 2009-04-02 16:04 |只看该作者
顺便问一下:
partial function 返回值是一个函数吗 ?

是不是所有返回值为函数的函数都为 partial function ?

论坛徽章:
0
4 [报告]
发表于 2009-04-02 16:07 |只看该作者
原帖由 flw 于 2009-4-2 16:03 发表
(+2) 和 (2+) 一样是因为加法符合交换律,不然还是有区别的。

应该不是这样吧
那 map 也有交换律?
^ 是没有交换律的,但也可以呀?

  1. Main> (^2) 3
  2. 9
  3. Main> (3^) 2
  4. 9
复制代码

之所以这两个都可以应该是因为 "+ " 为 infix 类型的吧 ?

[ 本帖最后由 izhier 于 2009-4-2 16:15 编辑 ]

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
5 [报告]
发表于 2009-04-02 16:27 |只看该作者
原帖由 izhier 于 2009-4-2 16:04 发表
顺便问一下:
partial function 返回值是一个函数吗 ?

是的。你可以在 GHCi 中使用 :t 查看它的类型。

是不是所有返回值为函数的函数都为 partial function ?

这个看你怎么理解了,你也可以将那个返回的函数看作原来函数的返回值。在 functional 语言中,function 是 first-class 对象。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2009-04-02 16:29 |只看该作者
嗯。同意 MMMIX。
至于下面那个问题……
我就不回答了。你自己琢磨琢磨。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
7 [报告]
发表于 2009-04-02 16:29 |只看该作者
原帖由 izhier 于 2009-4-2 16:07 发表

应该不是这样吧
那 map 也有交换律?
^ 是没有交换律的,但也可以呀?

Main> (^2) 3
9
Main> (3^) 2
9

可以这么用是一回事,这么用了以后效果相同不相同是另外一回事情。

论坛徽章:
0
8 [报告]
发表于 2009-04-02 16:33 |只看该作者
说一下 -,与 +, *, /, ^ 相比,它有点特别。


(1-) 是 \x-> 1-x

但 (-1) 或 (- 1) 都是 -1。这是因为 - 在此处被识别成单目运算符了。

如果想用 section 实现 \x->x-1, 要这样写


  1. (+ (-1))
复制代码


或者用 substract


  1. (substruct 1)
复制代码

论坛徽章:
0
9 [报告]
发表于 2009-04-02 16:37 |只看该作者

回复 #8 win_hate 的帖子

这样也可以:

  1. Main> ((-) 1) 1
  2. 0
复制代码

论坛徽章:
0
10 [报告]
发表于 2009-04-02 16:39 |只看该作者
原帖由 izhier 于 2009-4-2 16:37 发表
这样也可以:

Main> ((-) 1) 1
0



不一样的。 你这个等价与 (1-)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP