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

发布于 2022-08-11 15:30:02 字数 155 浏览 15 评论 9

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

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

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

小…楫夜泊 2022-08-21 22:01:08

还是从数学上来讲讲得清楚,学习了。

情未る 2022-08-21 21:57:58

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

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

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

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

我的奇迹 2022-08-21 21:11:58

(+) :: 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)。

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

七分※倦醒 2022-08-21 20:58:27

原帖由 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 编辑 ]

梦回旧景 2022-08-21 17:28:51

(+) :: (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 编辑 ]

幽蝶幻影 2022-08-21 01:31:38

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

我没说其它语言啊

反目相谮 2022-08-19 09:28:46

原帖由 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 编辑 ]

別甾虛僞 2022-08-19 05:51:36

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

原帖由 win_hate 于 2009-3-29 16:56 发表
如果给它三个参数,会出错的。

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

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

韵柒 2022-08-14 13:54:25

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

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

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文