什么是函数式编程
2010-09-14 13:13:57 来源:WEB开发网核心提示: 现在看一下recevier_fn的定义,这个函数正是一个闭包因为它保存了一个从其环境中引入的chan的引用,什么是函数式编程(3),部分函数的应用以及柯里化让我们定义一个将两数相加的加法函数:let plus a b =a + b;;下面给在教室后面睡觉的家伙们一些问题:plus是什么?
现在看一下recevier_fn的定义。这个函数正是一个闭包因为它保存了一个从其环境中引入的chan的引用。
部分函数的应用以及柯里化
让我们定义一个将两数相加的加法函数:
let plus a b =
a + b
;;
下面给在教室后面睡觉的家伙们一些问题:
plus是什么?
plus 2 3是什么?
plus 2是什么?
问题 1 很简单。plus是一个函数,它接受两个整数参数并返回一个整数。类型是这么写的:
plus : int -> int -> int
问题 2 就更简单了。plus 2 3是一个数字,整数5。类型是这么写的:
5 : int
但问题 3 怎么回答呢?貌似plus 2是一个错误。然而,实际上,并非如此。如果我们在OCaml的顶层输入这个表达式,那么它会告诉我们:
# plus 2;;
- : int -> int = <fun>
这不是一个错误。它告诉我们plus 2实际上是一个函数,它接受一个int并返回一个int。这是怎样的一个函数呢?首先我们给这个函数起个名字叫做(f),然后再进行一些实验,给它一些整数看看会发生什么:
# let f = plus 2;;
val f : int -> int = <fun>
# f 10;;
- : int = 12
# f 15;;
- : int = 17
# f 99;;
- : int = 101
在工程中,我们有足够的证据说plus 2就是将2加上另一个数的函数。
回到原来的定义,让我们“填入”第一个参数(a)2,则获得了:
let plus 2 b = (* 这不是真正的OCaml代码! *)
2 + b
;;
我希望你可以了解为何plus 2就是一个函数。
看一下这些表达式的类型也许就能够一窥函数类型中用到的奇怪的->箭头记号的原理:
更多精彩
赞助商链接