izhier 发表于 2009-03-29 19:00

原帖由 Magicloud 于 2009-3-29 18:25 发表 http://bbs2.chinaunix.net/images/common/back.gif
haskell中的體現就是
inc = (+) 1
使用參數省略定義的函數……
这个不是参数省略的函数吧
它应该本身就是一个函数

Hugs.Base> :t (+) 1
(1 +) :: Num a => a -> a

flw 发表于 2009-03-29 19:23

上面的讨论似乎把 currying 和 partial application 给搞混了。
Haskell 里面,curry 是指:
Prelude> :t (curry)
(curry) :: ((a, b) -> c) -> a -> b -> c
Prelude> :t (uncurry)
(uncurry) :: (a -> b -> c) -> (a, b) -> c
Prelude>

lambda 演算中所有的函数都只有一个参数。
Haskell 也是。a -> b -> c 本来就是 a -> ( b -> c ) 的意思。
当给 + 一个参数的时候,因为 + 的原型是 Num a -> Num a -> Num a,
因此 Beta 归约的结果类型是 Num a -> Num a(其中 -> 表示函数类型)。
当给 + 两个参数的时候,实际上是将第一个参数的 Beta 归约结果又进行了一次归约,
得到的是 Num a(不是函数类型)。
由于这个结果不是函数类型,因此你再给它第三个参数的时候,就出现类型错误了。

izhier 发表于 2009-03-29 19:26

flw 这么一说
我更加没头脑了
这个题目不知是用数学分析还是 lambda 演算:em14:
函数式编程应该比较倾向于 lambda 演算吧?

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

win_hate 发表于 2009-03-29 20:10

如果 haskell 不支持curring,那么 (+) 的类型就不是 a->b->c,而是 (a,b)->c 了

正是因为 haskell 支持 curring,我们才可以 partial application

从 a->a->a 上看,的确是 a->(a->a),也即接受一个参数,返回一个函数。

但据此就说 (+) 只有一个参数我觉得不妥。

curring 的引入本身是为了以一种统一的方式来支持多个参数,但当我们说 (+) 有多少个参数时,指的应该不是这种统一方式,而是它所支持的多个参数。

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

MMMIX 发表于 2009-03-29 20:32

原帖由 win_hate 于 2009-3-29 20:10 发表 http://bbs3.chinaunix.net/images/common/back.gif
curring 的引入本身是为了以一种统一的方式来支持多个参数,但当我们说 (+) 有多少个参数时,指的应该不是这种统一方式,而是它所支持的多个参数。
从 Haskell 的语法来说,(+) 确实只有一个参数。至于你说的后一种情况,其实是一种约定的说法。这里是有一些歧义,注意就好了。

izhier 发表于 2009-03-30 12:51

再一个问题:

haskell 中有没有 无参数 的函数呀?
:shock:

win_hate 发表于 2009-03-30 13:18

原帖由 izhier 于 2009-3-30 12:51 发表 http://bbs2.chinaunix.net/images/common/back.gif
再一个问题:

haskell 中有没有 无参数 的函数呀?
:shock:

我在 8 楼的回答有误。Haskell 中的函数的确是只有一个参数的。

我不知道 Haskellreport 里是如何定义函数的。如果按 curring 的方式,则应该有且只有一个参数。

由于无参函数总返回一个常值且不需要参数,可以认为常数是无参函数。

MMMIX 发表于 2009-03-30 14:41

原帖由 win_hate 于 2009-3-30 13:18 发表 http://bbs3.chinaunix.net/images/common/back.gif
由于无参函数总返回一个常值且不需要参数,可以认为常数是无参函数。
对头,由于 Haskell 的函数是没有 side effect 的,无参数的函数对 Haskell 来说没有意义。

izhier 发表于 2009-03-30 16:50

原帖由 win_hate 于 2009-3-30 13:18 发表 http://bbs2.chinaunix.net/images/common/back.gif
常数是无参函数
啊...常数都是函数呀!

那是不是 haskell 里 "一切皆函数" ?
就像 python 里 "一切皆对象"

flw 发表于 2009-03-30 16:53

原帖由 izhier 于 2009-3-30 16:50 发表 http://bbs3.chinaunix.net/images/common/back.gif

啊...常数都是函数呀!

那是不是 haskell 里 "一切皆函数" ?
就像 python 里 "一切皆对象"
…………
怎么听着这么俗呢。

不过 lambda 演算的基础确实是函数。包括自然数都是函数。
页: 1 [2] 3
查看完整版本: haskell中函数只有一个参数吗?