0
点赞
收藏
分享

微信扫一扫

手把手介绍函数式编程:从命令式重构到函数式


手把手介绍函数式编程:从命令式重构到函数式

本文是一篇手把手的函数式编程极简入门介绍,借助代码示例讲解细腻。但又不乏洞见,第一节中列举和点评了函数式种种让眼花缭乱的特质,给出了“理解函数式特质的指南针”:

函数式代码的核心特质就一条:无副作用

本文希望以另辟蹊径的方式来讲解函数式:首先展示我们平常编写的命令式而非函数式的代码示例,然后将这些示例重构成函数式风格。

本文的第一部分选用了简短的数据转换循环,将它们重构成函数式的​​map​​​和​​reduce​​​。第二部分则对更长的循环代码,将它们分解成多个单元,然后重构各个单元成函数式的。第三部分选用的是有一系列连续的数据转换循环代码,将其拆解成为一个函数式管道(​​functional pipeline​​)。

本文示例代码用的是​​Kotlin​​语言。

理解函数式特质的指南针

有很多函数式编程文章讲解了抽象的函数式技术:

  • 组合(​​composition​​)
  • 管道(​​pipelining​​)
  • 高阶函数(​​higher order function​​)

等等。当人们谈论函数式编程时,提到了多到令人迷路的​​函数式​​​特质(​​characteristics​​):

  • 不可变数据(​​immutable data​​)
  • 一等公民的函数​​first class function​​)
  • 尾调用优化(​​tail call optimisation​​)

这些是有助于函数式编程的语言特性

人们也会提到:

  • ​map​​​、​​reduce​
  • 管道、递归(​​recursing​​)
  • 柯里化(​​currying​​)以及
  • 高阶函数()的使用。

这些是用于编写函数式代码的编程技术

人们还会提到:

  • 并行化(​​parallelization​​)
  • 惰性求值(​​lazy eval(231, 243, 237); padding: 0px 3px; border-radius: 4px; overflow-wrap: break-word; text-indent: 0px;">​determinism​​)。

这些是函数式程序的优点

函数式的核心特质

无视这一切。函数式代码的核心特质就一条:

无副作用(​​no side effects​​)。

即代码逻辑不依赖于当前函数之外的数据,并且也不会更改当前函数之外的数据。所有其他的函数式 特质都可以从这一条派生出来。

开始表演

这是一个非函数式的函数:

val x = 0
fun incr() {
x + 1
}

而这是一个函数式的函数:

fun incr(x: Int): Int {
return x + 1
}

不要迭代列表,用map和reduce

​map​

​map​​输入一个函数和一个集合,创建一个新的空集合,在原来集合的每个元素进行映射,并将各个返回值插入到新集合中,然后返回新的集合。

命令式思维风格代码:

val numbers = listOf(1, 2, 3, 4, 5, 6, 7)
val sqrs = mutableListOf<Int>()
for (i in numbers) {
sqrs.add(i * i)
}
println(sqrs) // [1, 4, 9, 16, 25, 36, 49]

函数式思维风格代码:

val numbers = listOf(1, 2, 3, 4, 5, 6, 7)
val sqrs = numbers.map {
it * it
}
println(sqrs) // [1, 4, 9, 16, 25, 36, 49]

​reduce​

​reduce​​输入一个函数和一个集合,返回通过合并集合元素所创建的值。

这是一个简单的返回集合所有元素平方的总和的实现:

var sum = 0
for (i in numbers) {
sum += i * i
}
println(sum) // 140

上面是命令式思维风格的常规实现代码。

同样地,用函数式思维风格的代码实现如下:

val sum = numbers.reduce { acc, it -> it * it + acc }
println(sum) // 140

我们可以看出,函数式思维相比命令式思维:要更加抽象。

思考:为什么​​map​​​和​​reduce​​更好?

参考文章

​​A practical introduction to functional programming​​​ - ​​Mary Rose​​,2015-08-10 :https://maryrosecook.com/blog/post/a-practical-introduction-to-functional-programming

手把手介绍函数式编程:从命令式重构到函数式_ 函数式编程思维


举报

相关推荐

0 条评论