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 演算的基础确实是函数。包括自然数都是函数。