免费注册 查看新帖 |

Chinaunix

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

haskell infix 和 prefix 的疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-20 10:58 |只看该作者 |倒序浏览
在 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 或者另外定义一个函数呢?

论坛徽章:
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
2 [报告]
发表于 2008-10-20 12:11 |只看该作者
原帖由 drunkedcat 于 2008-10-20 10:58 发表
如果可以用在多元函数中,那用 map filter 之类的函数将是很方便的。

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

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

这个有什么问题么?

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

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2008-10-20 12:16 |只看该作者
可以吧。注意优先级就可以了。

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

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2008-10-20 12:19 |只看该作者
下面这段没看懂是啥意思。
如果可以用在多元函数中,那用 map filter 之类的函数将是很方便的。

比如

  1. insTest :: Int -> Int -> Int -> Int -> Int
  2. insTest x1 x2 x3 x4 = x1 + x2 + x3 + x4
复制代码


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

论坛徽章:
0
5 [报告]
发表于 2008-10-20 13:37 |只看该作者

回复 #4 flw 的帖子

谢谢关注。

是这个意思
比如


  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]
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2008-10-20 14:57 |只看该作者
用 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 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2008-10-22 10:09 |只看该作者
多谢楼上两位,这样看来,lambda 还是有它的用处的。

论坛徽章:
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
8 [报告]
发表于 2008-10-22 10:17 |只看该作者
原帖由 drunkedcat 于 2008-10-22 10:09 发表
lambda 还是有它的用处的。

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

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2008-10-22 11:45 |只看该作者
原帖由 drunkedcat 于 2008-10-22 10:09 发表
多谢楼上两位,这样看来,lambda 还是有它的用处的。

lambda 演算是 FP 的基础,当然有用了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP