免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: izhier
打印 上一主题 下一主题

haskell中函数只有一个参数吗? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-03-29 19:00 |只看该作者
原帖由 Magicloud 于 2009-3-29 18:25 发表
haskell中的體現就是
inc = (+) 1
使用參數省略定義的函數……

这个不是参数省略的函数吧
它应该本身就是一个函数

  1. Hugs.Base> :t (+) 1
  2. (1 +) :: Num a => a -> a
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
12 [报告]
发表于 2009-03-29 19:23 |只看该作者
上面的讨论似乎把 currying 和 partial application 给搞混了。
Haskell 里面,curry 是指:
  1. Prelude> :t (curry)
  2. (curry) :: ((a, b) -> c) -> a -> b -> c
  3. Prelude> :t (uncurry)
  4. (uncurry) :: (a -> b -> c) -> (a, b) -> c
  5. Prelude>
复制代码


lambda 演算中所有的函数都只有一个参数。
Haskell 也是。a -> b -> c 本来就是 a -> ( b -> c ) 的意思。
当给 + 一个参数的时候,因为 + 的原型是 Num a -> Num a -> Num a,
因此 Beta 归约的结果类型是 Num a -> Num a(其中 -> 表示函数类型)。
当给 + 两个参数的时候,实际上是将第一个参数的 Beta 归约结果又进行了一次归约,
得到的是 Num a(不是函数类型)。
由于这个结果不是函数类型,因此你再给它第三个参数的时候,就出现类型错误了。

论坛徽章:
0
13 [报告]
发表于 2009-03-29 19:26 |只看该作者
flw 这么一说
我更加没头脑了
这个题目不知是用数学分析还是 lambda 演算
函数式编程应该比较倾向于 lambda 演算吧?

[ 本帖最后由 izhier 于 2009-3-29 19:36 编辑 ]

论坛徽章:
0
14 [报告]
发表于 2009-03-29 20:10 |只看该作者
如果 haskell 不支持  curring,那么 (+) 的类型就不是 a->b->c,而是 (a,b)->c 了

正是因为 haskell 支持 curring,我们才可以 partial application

从 a->a->a 上看,的确是 a->(a->a),也即接受一个参数,返回一个函数。

但据此就说 (+) 只有一个参数我觉得不妥。

curring 的引入本身是为了以一种统一的方式来支持多个参数,但当我们说 (+) 有多少个参数时,指的应该不是这种统一方式,而是它所支持的多个参数。

[ 本帖最后由 win_hate 于 2009-3-29 20:11 编辑 ]

论坛徽章:
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
15 [报告]
发表于 2009-03-29 20:32 |只看该作者
原帖由 win_hate 于 2009-3-29 20:10 发表
curring 的引入本身是为了以一种统一的方式来支持多个参数,但当我们说 (+) 有多少个参数时,指的应该不是这种统一方式,而是它所支持的多个参数。

从 Haskell 的语法来说,(+) 确实只有一个参数。至于你说的后一种情况,其实是一种约定的说法。这里是有一些歧义,注意就好了。

论坛徽章:
0
16 [报告]
发表于 2009-03-30 12:51 |只看该作者
再一个问题:

haskell 中有没有 无参数 的函数呀?

论坛徽章:
0
17 [报告]
发表于 2009-03-30 13:18 |只看该作者
原帖由 izhier 于 2009-3-30 12:51 发表
再一个问题:

haskell 中有没有 无参数 的函数呀?


我在 8 楼的回答有误。Haskell 中的函数的确是只有一个参数的。

我不知道 Haskell  report 里是如何定义函数的。如果按 curring 的方式,则应该有且只有一个参数。

由于无参函数总返回一个常值且不需要参数,可以认为常数是无参函数。

论坛徽章:
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
18 [报告]
发表于 2009-03-30 14:41 |只看该作者
原帖由 win_hate 于 2009-3-30 13:18 发表
由于无参函数总返回一个常值且不需要参数,可以认为常数是无参函数。

对头,由于 Haskell 的函数是没有 side effect 的,无参数的函数对 Haskell 来说没有意义。

论坛徽章:
0
19 [报告]
发表于 2009-03-30 16:50 |只看该作者
原帖由 win_hate 于 2009-3-30 13:18 发表
常数是无参函数

啊...常数都是函数呀!

那是不是 haskell 里 "一切皆函数" ?
就像 python 里 "一切皆对象"

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
20 [报告]
发表于 2009-03-30 16:53 |只看该作者
原帖由 izhier 于 2009-3-30 16:50 发表

啊...常数都是函数呀!

那是不是 haskell 里 "一切皆函数" ?
就像 python 里 "一切皆对象"

…………
怎么听着这么俗呢。

不过 lambda 演算的基础确实是函数。包括自然数都是函数。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP