haskell infix 和 prefix 的疑问

发布于 2022-08-07 00:17:50 字数 568 浏览 12 评论 8

在 haskell 中,可以用 () 和 `` 让函数在 prefix 和 infix 之间转化,但是,这个仅限于 binary 函数,也就是有两个参数的函数。
另一方面,我们也知道,其实 haskell 中没有多参数的函数,只有单个参数的函数,多个函数的函数实际上是单个参数的函数在 binding 一个参数后变成了另一个函数,再 binding 再变,如此直到得出结果。

那么,为什么 infix 和 prefix 只可以用在两个参数的函数中呢?

如果可以用在多元函数中,那用 map filter 之类的函数将是很方便的。

比如

  1. insTest :: Int -> Int -> Int -> Int -> Int
  2. insTest x1 x2 x3 x4 = x1 + x2 + x3 + x4

复制代码

现在想把一个数组中每个元素依次替换其中的第三个参数,得到的结果是另一个数组,用 map 的话,应该怎样来写呢?
是不是要用 lambda 或者另外定义一个函数呢?

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

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

发布评论

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

评论(8

惜醉颜 2022-08-18 04:47:36

原帖由 drunkedcat 于 2008-10-22 10:09 发表
多谢楼上两位,这样看来,lambda 还是有它的用处的。

lambda 演算是 FP 的基础,当然有用了。

木緿 2022-08-18 04:47:29

原帖由 drunkedcat 于 2008-10-22 10:09 发表
lambda 还是有它的用处的。

它就是匿名函数,自然是有用的。

你没皮卡萌 2022-08-18 04:47:09

多谢楼上两位,这样看来,lambda 还是有它的用处的。

仙女 2022-08-18 04:38:41

用 lambda 或者 flip 就可以了。

  1. Prelude> map (x -> (+++) k1 k2 x k3) arr2
  2. [605,606,607,608,609,610]
  3. Prelude> map (flip (k1 +++ k2) k3) arr2
  4. [605,606,607,608,609,610]

复制代码
[ 本帖最后由 flw 于 2008-10-20 15:05 编辑 ]

独自←快乐 2022-08-18 04:38:12

谢谢关注。

是这个意思
比如

  1. let arr = [1..4]
  2. let k1 = 100
  3. let k2 = 200
  4. let k3 = 300
  5. let (+++)  a b c d =  a + b + c + d
  6. let arr2 = [5..10]

复制代码
现在想得到对于 arr2 中的每一个 x, 计算

  1. (+++) k1 k2 x k3

复制代码
得到

  1. [605..610]

复制代码

与他有关 2022-08-18 03:46:25

下面这段没看懂是啥意思。

如果可以用在多元函数中,那用 map filter 之类的函数将是很方便的。

比如

  1. insTest :: Int -> Int -> Int -> Int -> Int
  2. insTest x1 x2 x3 x4 = x1 + x2 + x3 + x4

复制代码

现在想把一个数组中每个元素依次替换其中的第三个参数,得到的结果是另一个数组,用 map 的话,应该怎样来写呢?
是不是要用 lambda 或者另外定义一个函数呢?

人间☆小暴躁 2022-08-18 01:24:29

可以吧。注意优先级就可以了。

  1. *Main> let (+++) a b c = a + b + c
  2. *Main> (+++) 1 2 3
  3. 6
  4. *Main> 4 +++ 5 $ 6
  5. 15
  6. *Main> let sum a b c = a + b + c
  7. *Main> sum 7 8 9
  8. 24
  9. *Main> 10 `sum` 11 $ 12
  10. 33
  11. *Main>

复制代码
[ 本帖最后由 flw 于 2008-10-20 12:20 编辑 ]

夢归不見 2022-08-17 10:05:42

原帖由 drunkedcat 于 2008-10-20 10:58 发表
如果可以用在多元函数中,那用 map filter 之类的函数将是很方便的。

how? 另外,map/filter 一次只能处理 list 中的一个元素。要一次处理 list 中的多个元素,可以用 pattern match。

是不是要用 lambda 或者另外定义一个函数呢?

这个有什么问题么?

[ 本帖最后由 MMMIX 于 2008-10-20 12:14 编辑 ]

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