haskell中函数只有一个参数吗?
(+) a b
=> ((+)a) b
其实该计算过程涉及到两个函数吧?
那我们该说 (+) 函数有两个参数还是有一个参数?
[ 本帖最后由 izhier 于 2009-3-29 17:16 编辑 ]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
(+) a b
=> ((+)a) b
其实该计算过程涉及到两个函数吧?
那我们该说 (+) 函数有两个参数还是有一个参数?
[ 本帖最后由 izhier 于 2009-3-29 17:16 编辑 ]
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(9)
还是从数学上来讲讲得清楚,学习了。
haskell中的體現就是
inc = (+) 1
使用參數省略定義的函數……
(+) :: Num a => a -> a -> a 是类型签名,下面那个是解释,包括函数是如何使用这些参数的。
不过我觉得他这里说得不够准确:
这样只强调了给 (+) 一个参数的情况,而实际上只有给 (+) 两个参数,调用才是完整的。
用数学上的函数来讲比较清楚。比如有一个函数 add (x,y) ,求 x 和 y 的和。有时候我们会说:
如果固定其中的参数 x=1,则得到函数 f(y)=add (1,y)。
当你给 (+) 一个参数时,相当于固定了一个参数。
恩,上面是我理解有误
yaht 中 4.4.2 节 Higher-Order Types 有说:
复制代码
这种说法是只用于
说明函数的类型
还是
也说明函数的执行过程呀?
[ 本帖最后由 izhier 于 2009-3-29 18:03 编辑 ]
(+) :: (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 编辑 ]
>> 改了一下标题,锁定 haskell 语言,不是太了解其他函数式语言。
我没说其它语言啊
(+) 1 2 3 出错追踪到最后是把 3 作用在 3 上,即你说的类型不匹配。
但两个参数不出错,三个出错,在这里本质上还是给 (+) 喂了三个参数造成的。因为当我写下 (+) 1 2 3 时,我的本意是 (+) 接受三个参数,而不是 ((+) 1 2) 3
把这个作为判断是不可靠的,但在这里作为演示应该没有问题吧。
[ 本帖最后由 win_hate 于 2009-3-29 17:23 编辑 ]
改了一下标题,锁定 haskell 语言,不是太了解其他函数式语言。
(+) 的类型是:Num a => a -> (a -> a),出错是因为类型不匹配,不是参数数目不匹配吧 ?
这不能判断 (+) 有两个参数吧?
[ 本帖最后由 izhier 于 2009-3-29 17:20 编辑 ]
所以 (+) 有两个参数。不过 Haskell 的函数支持 curring, a->a->a 可以理解为 a->(a->a)
因此,你个 (+) 一个值时,它会返回一个 (a->a) 类型的函数。
如果给它三个参数,会出错的。