WEB开发网
开发学院网页设计JavaScript 什么是函数式编程 阅读

什么是函数式编程

 2010-09-14 13:13:57 来源:WEB开发网   
核心提示: plus : int -> int -> intplus 2 : int -> intplus 2 3 : int这个过程称之为currying(柯里化,也可能叫做uncurrying反柯里化,什么是函数式编程(4),我至今也搞不清哪个是哪个),它之所以如此命名是为了纪念

  plus : int -> int -> int
 plus 2 : int -> int
plus 2 3 : int

这个过程称之为currying(柯里化,也可能叫做uncurrying反柯里化,我至今也搞不清哪个是哪个)。它之所以如此命名是为了纪念Haskell Curry,他对lambda算子做出了一些相关的重要贡献。由于我要尽可能回避在OCaml背后的数学原理——因为这十分冗长也不切主题——所以这个问题上我就不深入了。如果你对此感兴趣,你可以通过Google搜索来查找更多关于柯里化的更多信息。

还记得我们前面的double和multiply函数吗?multiply的定义是这样的:

let multiply n list =
 let f x =
  n * x
 in
 List.map f list
 ;;

现在我们来定义double、triple,这些函数很好写,如下:

let double = multiply 2;;
let triple = multiply 3;;

它们其实都是函数,看:

# double [1; 2; 3];;
- : int list = [2; 4; 6]
# triple [1; 2; 3];;
- : int list = [3; 6; 9]

你也可以像这样直接使用部分应用(无需中间的f函数)

# let multiply n = List.map (( * ) n);;
val multiply : int -> int list -> int list = <fun>
# let double = multiply 2;;
val double : int list -> int list = <fun>
# let triple = multiply 3;;
val triple : int list -> int list = <fun>
# double [1; 2; 3];;
- : int list = [2; 4; 6]
# triple [1; 2; 3];;
- : int list = [3; 6; 9]

在上面的例子中,(( * ) n)是( * )(乘法)函数的部分应用。注意空格是必须的,这样OCaml才不会认为(*是一个注释的开始。

上一页  1 2 3 4 5 6 7  下一页

Tags:什么 函数 编程

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接