izhier 发表于 2009-03-29 16:37

haskell中函数只有一个参数吗?

(+) a b
=> ((+)a) b

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

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

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

win_hate 发表于 2009-03-29 16:56


Prelude> :t (+)
(+) :: (Num a) => a -> a -> a
Prelude>


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

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

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

izhier 发表于 2009-03-29 17:05

改了一下标题,锁定 haskell 语言,不是太了解其他函数式语言。
原帖由 win_hate 于 2009-3-29 16:56 发表 http://bbs2.chinaunix.net/images/common/back.gif
如果给它三个参数,会出错的。
(+) 的类型是:Num a => a -> (a -> a),出错是因为类型不匹配,不是参数数目不匹配吧 ?
这不能判断 (+) 有两个参数吧?

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

win_hate 发表于 2009-03-29 17:21

原帖由 izhier 于 2009-3-29 17:05 发表 http://bbs2.chinaunix.net/images/common/back.gif

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

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

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

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

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

win_hate 发表于 2009-03-29 17:23

>> 改了一下标题,锁定 haskell 语言,不是太了解其他函数式语言。

我没说其它语言啊

Magicloud 发表于 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 编辑 ]

izhier 发表于 2009-03-29 17:51

原帖由 win_hate 于 2009-3-29 17:23 发表 http://bbs2.chinaunix.net/images/common/back.gif
>> 改了一下标题,锁定 haskell 语言,不是太了解其他函数式语言。

我没说其它语言啊
恩,上面是我理解有误

yaht 中 4.4.2 节 Higher-Order Types 有说:

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

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

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

win_hate 发表于 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)。

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

Magicloud 发表于 2009-03-29 18:25

原帖由 win_hate 于 2009-3-29 18:09 发表 http://bbs2.chinaunix.net/images/common/back.gif
(+) :: Num a => a -> a -> a 是类型签名,下面那个是解释,包括函数是如何使用这些参数的。

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



这样只强调了给 (+) 一个参数的情况,而实际上只有给 (+) 两个参数,调用 ...
haskell中的體現就是
inc = (+) 1
使用參數省略定義的函數……

drunkedcat 发表于 2009-03-29 18:55

还是从数学上来讲讲得清楚,学习了。
页: [1] 2 3
查看完整版本: haskell中函数只有一个参数吗?