函数式编程

Go学习笔记

“正统"函数式编程

  • 不可变性:不能有状态,只有常量和函数

  • 函数只能有一个参数

    // 正统函数式编程
    type iAdder func(int) (int, iAdder)
      
    func adder(base int) iAdder {
      return func(v int) (int, iAdder) {
          return base + v, adder(base + v)
      }
    }
    

Go 函数式编程

  • 函数是一等公民:参数,变量,返回值都可以是函数

  • 高阶函数

  • 闭包

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

闭包

Python 闭包

def adder():
    sum = 0
    def f(v):
        nonlocal sum
        sum += v
        return sum
    return f

原生支持闭包

使用_closure_来查看闭包内容

C++闭包

auto adder() {
  auto sum = 0;
  return [=] (int value) mutable {
    sum += value;
    return sum;
  }
}

过去:stl或者boost带有类似库

c++ 11及以后原生支持闭包

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表达式均支持闭包

Go 

See also