2009-05-25

Haskell的天空 - 函数定义

Haskell是一门纯函数式语言。不同于C/C++等语言的是,函数式语言中的函数乃是语言中的一等公民,它们本身也可以作为函数参数或者返回值,就像整型、字符串一样。几乎所有函数式语言的教程中,第一个示例函数都是求阶乘。在Haskell中:
fac 0 = 1
fac n = n * fac(n-1)


这看起来和它的数学定义几无二致。理解它只需要明白一句话:Haskell的函数定义是基于逐行模式匹配的。将其载入ghci之类的解释器:
Prelude> :load "fac.hs"
[1 of 1] Compiling Main ( fac.hs, interpreted )
Ok, modules loaded: Main.
*Main> fac 4
24
*Main> fac 40
815915283247897734345611269596115894272000000000


有了上面的热身之后add函数的定义则很容易理解了:
add x y = x + y


这个简单的add函数可以用于演示所谓"curried functions",由著名美国数学家、逻辑学家Haskell Brooks Curry提出,haskell语言、curry算子都是以其名、和姓命名。"curried functions"的意思是,函数可以部分求值,不必强制程序员提供所有的参数。"add 2 3"的求值结果是5,"add 2"的结果则是一个高阶函数,它对任何输入数值加二。
*Main> add 1 2
3
*Main> let add2 = add 2
*Main> add2 3
5


另外,Haskell还支持函数的composition,比如数学记法中(f · g)(x) = f(g(x))。Haskell中用点号(.)表示function composion。如下例,求值一个列表中所有数值的相对数:
Prelude> map (negate . abs) [5,-3,-6,7,-3,2,-19,24]
[-5,-3,-6,-7,-3,-2,-19,-24]

标签:

0 Comments:

发表评论

<< Home