haskell中函数只有一个参数吗?
(+) a b=> ((+)a) b
其实该计算过程涉及到两个函数吧?
那我们该说 (+) 函数有两个参数还是有一个参数?
[ 本帖最后由 izhier 于 2009-3-29 17:16 编辑 ]
Prelude> :t (+)
(+) :: (Num a) => a -> a -> a
Prelude>
所以 (+) 有两个参数。不过 Haskell 的函数支持curring, a->a->a可以理解为 a->(a->a)
因此,你个 (+) 一个值时,它会返回一个 (a->a) 类型的函数。
如果给它三个参数,会出错的。 改了一下标题,锁定 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 编辑 ] 原帖由 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 编辑 ] >> 改了一下标题,锁定 haskell 语言,不是太了解其他函数式语言。
我没说其它语言啊 (+) :: (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 编辑 ] 原帖由 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 编辑 ]
回复 #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)。
当你给 (+) 一个参数时,相当于固定了一个参数。 原帖由 win_hate 于 2009-3-29 18:09 发表 http://bbs2.chinaunix.net/images/common/back.gif
(+) :: Num a => a -> a -> a 是类型签名,下面那个是解释,包括函数是如何使用这些参数的。
不过我觉得他这里说得不够准确:
这样只强调了给 (+) 一个参数的情况,而实际上只有给 (+) 两个参数,调用 ...
haskell中的體現就是
inc = (+) 1
使用參數省略定義的函數…… 还是从数学上来讲讲得清楚,学习了。