1. 什么是函数式编程?python
函数式编程是阿隆佐思想的在现实世界中的实现, 它将电脑运算视为数学上的函数计算,而且避免使用程序状态以及异变物件。 函数式编程的最重要基础是λ演算。并且λ演算的函數能够接受函數當做輸入(引數)和輸出(傳出值),函數式編程更加強調程序执行的结果而非执行的过程,倡导利用若干简单的执行单元让计算结果不断渐进,逐层推导复杂的运算,而不是设计一个复杂的执行过程。函数式编程的杀手锏正是当今世界上日益增加的并行性编程和元数据编程趋势。其主要思想就是把运算过程尽可能写成一系列嵌套的函数调用git
2. 函数式编程的特色:程序员
str
就是一类不可变的数据 结构。 你不能在原来的字符串上进行修改,每次想要进行相似的操做,其实都是生成了一个新的
str
对象。 然而 Python 中的链表结构则是可变的。
a = "hello ," b = a a += 'world' print a # hello ,world print b # hello ,
swift中更多的是值类型,而不是引用类型,你会发现Int,Float,String,Array,Dictionary等都是Struct类型,而Struct都是值类型【暗示告终构体应该主要 用于封装数据】,固然Enum也是值类型github
在swift中区分值类型和引用类型是为了将可变和不可不区分开来。值类型的数据传递给函数,函数内部能够自由拷贝,改变值,而不用担忧产生反作用。在多线 程环境下,多个线程同时运行,可能会意外错误地修改数据,这经常会是一种难以调试的bug。而使用值类型,你能够安全地在线程间传递数据,由于值类型传递 是拷贝,因此无需在线程间同步数据变化。这就能够保证代码线程环境下的安全性。编程
swift中的参数定义中加入inout,这样的话就能够经过参数来修改变量。这个特性颇有C的风格。swift
使用swift自带的数据结构并不能很好的的实现“无反作用”的“纯函数式”编程。幸亏做为一种关注度很高的语言, 已经有开发者为其实现了一套彻底知足不可变要 求的数据结构和库:Swiftz。坚持使用let和swiftz提供的数据结构来操做,就能够实现“纯函数式”编程。数组
不变性有诸多好处安全
更高层次的抽象。程序员能够以更接近数学的方式思考问题。数据结构
更容易理解的代码。因为不存在反作用,不管多少次执行,相同的输入就意味着相同的输出。纯函数比有可变状态的函数和对象理解起来要容易简单得多。你无需再担忧对象的某个状态的改变,会对它的某个行为(函数)产生影响。多线程
线程安全的代码。这意味着多线程环境下,运行代码没有同步问题。它们也不可能由于异常的发生而处于没法预测的状态中。
惰性求值
惰性计算是函数式编程语言的一个特性。惰性计算的表达式不在它被绑定到变量以后就当即求值,而是在该值被取用的时候求值。惰性计算有以下优势。
func doSomeWork(optional:Int?,defaultValue:Int)->Int{ if let opt = optional{ return opt }else{ return defaultValue } } func doSomeWorkNew(optional:Int?, defaultValue:()->Int)->Int{ if let opt = optional{ return opt }else{ return defaultValue() } } let value:Int? = 1 doSomeWork(value, (2+5)) doSomeWorkNew(value, { () -> Int in return 2+5 })
上面的代码能够感受到惰性求值的好处。
swift也提供了支持惰性求值的语法:下面展现了将默认是严格求值的数组变为惰性序列:
let r = 1...3 let seq = lazy(r).map { (i: Int) -> Int in println("mapping \(i)") return i * 2 } for i in seq { println(i) }
Swift对函数式编程的支持,使得程序员多了一种选择。Swift并不强迫程序员必定要以面向对象的方法思惟。在场景合适的状况下,程序员能够选择使用函数式风格编写代码。若是确实是合适的场景,就可以改善生产力。现实的选择是支持面向对象编程的同时,提供函数式的支持。这样,在大部分面向对象游刃有余的地方,仍然可使用面向对象的方法。而在适合函数式编程的地方,而你又拥有函数式编程的思惟和能力时,还能够采用函数式的编程方法改善生产力。
接下来的系列文章中我将以《Functional Programing in Swift》这本书,来一块儿学习swift的函数式编程。