我们先来介绍几个概念:
什么是纯正的函数式编程?
- 不可变性:不能有状态,只有常量和函数
- 函数只能有一个参数
Go与Python作为一种通用的编程语言,它只是实现了函数式编程的一部分东西,并不纯正,它俩的函数式编程主要体现在闭包上面,我们来写一个数字累加的函数看一下,两种语言分别是怎么实现的。
先来看Go 语言的
func adder() func(int) int {
sum := 0
return func(v int) int {
sum += v
return sum
}
}
func main() {
a := adder()
for i := 0; i < 10; i++{
fmt.Println(a(i))
}
}
上面的两个函数就实现闭包的功能
Python实现的方式
def adder(value):
sum = 10
def sumAll(value):
nonlocal sum
sum = sum+value
return sum
return sumAll
if __name__ =='__main__':
result = adder(sum)
# 打印环境变量
print(result.__closure__[0].cell_contents)
for x in range(10):
print(result(x))
Python是原生支持闭包的,你可以使用closure查看闭包内容
我怎么感觉 Go的实现方式更好一点呢?你怎么认为呢?
最后我们用Go语言实现一个正统的函数式编程
type iAdder func(int) (int, iAdder)
func adders(base int) iAdder{
return func(v int) (int, iAdder) {
return base + v, adders(base+v)
}
}
func main() {
a := adders(0)
for i := 0; i < 10; i++{
var s int
s, a = a(i)
fmt.Println(s,a)
}
}
上面这个就是正统的函数式编程的写法,它没有定义变量,都是函数。