partial function 也可以这样用(infix的)

发布于 2022-08-17 21:46:37 字数 1275 浏览 17 评论 9

我们通常写代码是这样写的:

  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 编辑 ]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

无人问我粥可暖 2022-08-22 00:14:57

原帖由 izhier 于 2009-4-2 16:37 发表
这样也可以:

Main> ((-) 1) 1
0

不一样的。 你这个等价与 (1-)

誰認得朕 2022-08-22 00:11:09

这样也可以:

  1. Main> ((-) 1) 1
  2. 0

复制代码

往日 2022-08-22 00:01:12

说一下 -,与 +, *, /, ^ 相比,它有点特别。

(1-) 是 x-> 1-x

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

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

  1. (+ (-1))

复制代码

或者用 substract

  1. (substruct 1)

复制代码

扭转时空 2022-08-21 23:58:08

原帖由 izhier 于 2009-4-2 16:07 发表

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

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

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

茶花眉 2022-08-21 23:07:49

嗯。同意 MMMIX。
至于下面那个问题……
我就不回答了。你自己琢磨琢磨。

胡渣熟男 2022-08-21 21:50:19

原帖由 izhier 于 2009-4-2 16:04 发表
顺便问一下:
partial function 返回值是一个函数吗 ?

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

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

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

鱼窥荷 2022-08-21 18:00:02

原帖由 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 编辑 ]

往事随风而去 2022-08-21 01:54:34

顺便问一下:
partial function 返回值是一个函数吗 ?

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

命硬 2022-08-20 06:26:43

(+2) 和 (2+) 一样是因为加法符合交换律,不然还是有区别的。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文