免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-29 16:37 |只看该作者 |倒序浏览
(+) a b
=> ((+)a) b

其实该计算过程涉及到两个函数吧?

那我们该说 (+) 函数有两个参数还是有一个参数?

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

论坛徽章:
0
2 [报告]
发表于 2009-03-29 16:56 |只看该作者
Prelude> :t (+)
(+) :: (Num a) => a -> a -> a
Prelude>


所以 (+) 有两个参数。不过 Haskell 的函数支持  curring, a->a->a  可以理解为 a->(a->a)

因此,你个 (+) 一个值时,它会返回一个 (a->a) 类型的函数。

如果给它三个参数,会出错的。

论坛徽章:
0
3 [报告]
发表于 2009-03-29 17:05 |只看该作者
改了一下标题,锁定 haskell 语言,不是太了解其他函数式语言。
原帖由 win_hate 于 2009-3-29 16:56 发表
如果给它三个参数,会出错的。

(+) 的类型是:Num a => a -> (a -> a),出错是因为类型不匹配,不是参数数目不匹配吧 ?
这不能判断 (+) 有两个参数吧?

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

论坛徽章:
0
4 [报告]
发表于 2009-03-29 17:21 |只看该作者
原帖由 izhier 于 2009-3-29 17:05 发表

(+) 的类型是:Num a => a -> (a -> a),出错是因为类型不匹配,不是参数数目不匹配吧 ?
这不能判断 (+) 有两个参数吧?


(+) 1 2 3 出错追踪到最后是把 3 作用在 3 上,即你说的类型不匹配。

但两个参数不出错,三个出错,在这里本质上还是给 (+) 喂了三个参数造成的。因为当我写下 (+) 1 2 3 时,我的本意是 (+) 接受三个参数,而不是 ((+) 1 2) 3

把这个作为判断是不可靠的,但在这里作为演示应该没有问题吧。

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

论坛徽章:
0
5 [报告]
发表于 2009-03-29 17:23 |只看该作者
>> 改了一下标题,锁定 haskell 语言,不是太了解其他函数式语言。

我没说其它语言啊

论坛徽章:
0
6 [报告]
发表于 2009-03-29 17:26 |只看该作者
(+) :: (Num a) => a -> a -> a
这表示(+)需要两个参数,返回一个,均是a类型,a是Num的一个实例。
这确定表示(+)只需要两个参数。而直接给多余两个参数,会使ghc将后边的理解为“半成品计算”(curring),于是出现类型错。

No instance for (Num (t -> t1))
  arising from a use of `+' at xxx
Possible fix: add an instance declaration for (Num (t -> t1))

你需要深入理解做个错误信息。

[ 本帖最后由 Magicloud 于 2009-3-29 17:27 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2009-03-29 17:51 |只看该作者
原帖由 win_hate 于 2009-3-29 17:23 发表
>> 改了一下标题,锁定 haskell 语言,不是太了解其他函数式语言。

我没说其它语言啊

恩,上面是我理解有误

yaht 中 4.4.2 节 Higher-Order Types 有说:

  1. (+) :: Num a => a -> a -> a
  2. + is a function which, for some type a which is an instance of Num, takes a value of
  3. type a and produces another function which takes a value of type a and produces a value
  4. of type a. In short hand, we might say that + takes two values of type a and produces a
  5. value of type a, but this is less precise.
复制代码

这种说法是只用于
说明函数的类型
还是
也说明函数的执行过程呀?

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

论坛徽章:
0
8 [报告]
发表于 2009-03-29 18:09 |只看该作者

回复 #7 izhier 的帖子

(+) :: Num a => a -> a -> a 是类型签名,下面那个是解释,包括函数是如何使用这些参数的。

不过我觉得他这里说得不够准确:

takes a value of
type a and produces another function which takes a value of type a and produces a value
of type a.


这样只强调了给 (+) 一个参数的情况,而实际上只有给 (+) 两个参数,调用才是完整的。

用数学上的函数来讲比较清楚。比如有一个函数 add (x,y) ,求 x 和 y 的和。有时候我们会说:

如果固定其中的参数 x=1,则得到函数 f(y)=add (1,y)。

当你给 (+) 一个参数时,相当于固定了一个参数。

论坛徽章:
0
9 [报告]
发表于 2009-03-29 18:25 |只看该作者
原帖由 win_hate 于 2009-3-29 18:09 发表
(+) :: Num a => a -> a -> a 是类型签名,下面那个是解释,包括函数是如何使用这些参数的。

不过我觉得他这里说得不够准确:



这样只强调了给 (+) 一个参数的情况,而实际上只有给 (+) 两个参数,调用 ...

haskell中的體現就是
inc = (+) 1
使用參數省略定義的函數……

论坛徽章:
0
10 [报告]
发表于 2009-03-29 18:55 |只看该作者
还是从数学上来讲讲得清楚,学习了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP