partial function 也可以这样用(infix的)
我们通常写代码是这样写的:
- add2 x = x + 2
- mySum xs = foldr (+) 0 xs
复制代码
但 partial function 为我们提供了一个简写的方法
例如:
- add2 = (+2)
- mySum = foldr (+) 0
复制代码
上面的 "(+2)" 和 "foldr (+) 0" 就是 partial function
- Main> :t add2
- add2 :: Integer -> Integer
- Main> :t mySum
- mySum :: [Integer] -> Integer
- Main> :t (+2)
- flip (+) 2 :: Num a => a -> a
- Main> :t foldr (+) 0
- foldr (+) 0 :: Num a => [a] -> a
复制代码
这里的 (+2) 很特殊,也可以写为 (2+)
原来一直以为只有 + - * / ^ 等这几个运算符可以这样,没想到下面也可以
可以试试这一个:
- eachBy = (`map` [1, 2, 3, 4])
- addEach2To = ((+2) `map`)
复制代码
- Main> eachBy (+2)
- [3,4,5,6]
- Main> addEach2To [1, 2, 3, 4]
- [3,4,5,6]
复制代码
infix 函数 partial function 有两种形式,一种与第一个参数结合,另一种是与与第二个参数结合
[ 本帖最后由 izhier 于 2009-4-2 16:02 编辑 ]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
不一样的。 你这个等价与 (1-)
这样也可以:
复制代码
说一下 -,与 +, *, /, ^ 相比,它有点特别。
(1-) 是 x-> 1-x
但 (-1) 或 (- 1) 都是 -1。这是因为 - 在此处被识别成单目运算符了。
如果想用 section 实现 x->x-1, 要这样写
复制代码
或者用 substract
复制代码
可以这么用是一回事,这么用了以后效果相同不相同是另外一回事情。
嗯。同意 MMMIX。
至于下面那个问题……
我就不回答了。你自己琢磨琢磨。
是的。你可以在 GHCi 中使用 :t 查看它的类型。
这个看你怎么理解了,你也可以将那个返回的函数看作原来函数的返回值。在 functional 语言中,function 是 first-class 对象。
应该不是这样吧
那 map 也有交换律?
^ 是没有交换律的,但也可以呀?
复制代码
之所以这两个都可以应该是因为 "+ " 为 infix 类型的吧 ?
[ 本帖最后由 izhier 于 2009-4-2 16:15 编辑 ]
顺便问一下:
partial function 返回值是一个函数吗 ?
是不是所有返回值为函数的函数都为 partial function ?
(+2) 和 (2+) 一样是因为加法符合交换律,不然还是有区别的。