函数与闭包
func adder() func(int) int {
sum := 0
return func(v int) int {
sum += v
return sum
}
}

func main() {
adder := adder()
for i := 0; i < 10; i++ {
fmt.Printf("0 + 1 + ... + %d = %d \n", i, adder(i))
}
}

//正统函数式编程写法
type iAdder func(int) (int, iAdder)

func adder2(base int) iAdder {
return func(v int) (int, iAdder) {
return v + base, adder2(v + base)
}
}

func main() {
b := adder2(0)
for i := 0; i < 10; i++ {
var sum int
sum, b = b(i)
fmt.Printf("0 + 1 + ... + %d = %d\n", i, sum)
}
}

函数式编程-小茂博客
图文说明
python中的闭包
//python中的闭包
def adder():
sum = 0

def f(value):
nonlocal sum
sum += value
return
return


★python原生支持闭包
★使用_closure_来查看闭包内容
c++中的闭包
//c++中的闭包
auto adder(){
auto sum = 0;
return [=] (int value) mutable {
sum += value;
return sum;
};
}

★ 过去 :stl或者boost带有类似库
★ c++11及以后:支持闭包
java中的闭包
//java中的闭包
function<Integer, Integer> adder() {
final Holder<Integer> sum = new Holder<>(0);
return (Integer value) -> {
sum.value += value;
return sum.value;
};
}

★ 1.8以后:使用Function接口和Lambda表达式来创建函数对象
★ 匿名类或Lambda表达式均支持闭包
函数式编程 vs 函数指针
★函数是一等公民

★高阶函数

★函数——>闭包
“正统”函数式编程
 
★ 不可变性:不能有状态,只有常量和函数

★ 函数只能有一个参数

★ 本课程不作上述严格规定