美文网首页
Go 函数式编程(三)

Go 函数式编程(三)

作者: LL大L | 来源:发表于2018-06-21 10:18 被阅读17次

欢迎来我的博客

函数式编程

  • 函数式一等公民:参数,变量,返回值都可以是函数
  • 高阶函数:函数的参数也可以是一个函数
  • 函数 -> 闭包
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++  {
       // 0 + 1 + ... + 0 = 0
       // 0 + 1 + ... + 1 = 1
       // 0 + 1 + ... + 2 = 3
       // 0 + 1 + ... + 3 = 6
       // 0 + 1 + ... + 4 = 10
       // 0 + 1 + ... + 5 = 15
       // 0 + 1 + ... + 6 = 21
       // 0 + 1 + ... + 7 = 28
       // 0 + 1 + ... + 8 = 36
       // 0 + 1 + ... + 9 = 45
        fmt.Printf("0 + 1 + ... + %d = %d\n", i, a(i) )
    }
}

上面的代码主要介绍了go 语言中的闭包,在函数返回时,并不是直接返回一个结果,而是返回类似下图结构的一个闭包

15286958675852.jpg

正统函数式编程

adder2函数与adder 函数的区别是,adder2会少一个自由变量,但相对来说更不容易阅读一些

type iAdder func(int) (int, iAdder)

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

func main() {

    a := adder2(0)
    for i := 0; i < 10; i++  {
        var s int
        s, a = a(i)
       // 0 + 1 + ... + 0 = 0
       // 0 + 1 + ... + 1 = 1
       // 0 + 1 + ... + 2 = 3
       // 0 + 1 + ... + 3 = 6
       // 0 + 1 + ... + 4 = 10
       // 0 + 1 + ... + 5 = 15
       // 0 + 1 + ... + 6 = 21
       // 0 + 1 + ... + 7 = 28
       // 0 + 1 + ... + 8 = 36
       // 0 + 1 + ... + 9 = 45
        fmt.Printf("0 + 1 + ... + %d = %d\n", i, s)
    }
}

python 中的闭包

python 原生支持闭包
可以使用_closure来查看闭包的内容

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

c++的闭包

过去stl或者boost带有类似的库,c++11及以后开始支持闭包

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

java 中的闭包

1.8以后使用Function接口和Lambda表达式来创建函数对象,匿名类或Lambda表达式均支持闭包

Function<Integer, Integer> adder() {
    final Holder<Integer> sum = new Holder<>(0);
    return (Integer value) -> {
        sum.value += value;
        return sum.value;
    }
}

c# 中的闭包

C# 中可以使用Func来进行闭包

Func<int> adder() {
    var sum = 0;
    return (int value) => {
        sum += value;
        return sum;
    };
}

闭包的应用

斐波那契数列

func fibonacci() func() int {
    a, b := 0, 1
    return func() int {
        a, b = b, a + b
        return a
    }
}

func main() {
    
    f := fibonacci()
    fmt.Println(f()) // 1
    fmt.Println(f()) // 1
    fmt.Println(f()) // 2
    fmt.Println(f()) // 3
    fmt.Println(f()) // 5
    fmt.Println(f()) // 8
}

使用函数遍历二叉树

通过下面的例子我们可以看到,闭包的使用可以减少我们写很多代码

func (node *Node) TraverseFunc(f func(*Node)) {
    if node == nil {
        return
    }
    
    node.Left.TraverseFunc(f)
    f(node)
    node.Right.TraverseFunc(f)
}

func (node *Node) Traverse() {
    node.TraverseFunc(func(node *Node) {
        node.Print()
    })
    fmt.Println()
}

相关文章

  • Go 函数式编程实战

    Go 函数式编程实战-目录 序致谢前言关于本书关于作者 函数式编程简介1.1 函数概述1.2 什么是函数式编程1....

  • GO学习笔记(12)-斐波那契数列与函数编程

    目录 函数指针 vs 函数式编程 闭包 斐波那契数列与函数接口 函数指针 vs 函数式编程 函数是go语言中的...

  • Go 函数式编程(三)

    欢迎来我的博客 函数式编程 函数式一等公民:参数,变量,返回值都可以是函数 高阶函数:函数的参数也可以是一个函数 ...

  • Swift函数式编程与面向协议编程

    函数式编程(FP) 一、函数式编程(FP)-高阶函数 二、函数式编程(FP) - 柯里化(Currying) 三、...

  • 函数式编程

    我们今天说的Go中的函数式编程主要是体现在闭包上面的,比如 我们首先对比两个概念 函数式编程 vs 函数指针 函数...

  • 函数式编程

    本文转载自: 函数式编程 当我们说起函数式编程来说,我们会看到如下函数式编程的长相: 函数式编程的三大特性:imm...

  • # Go 方法编程与面向对象

    上一节,我们看到 Go 函数特性及函数式编程风格。这一节,将会主要展示Go的方法特性及面向对象编程。什么是方法?当...

  • RxSwift初探(1)

    一、前提:函数响应式编程思想 简单来说 函数响应式编程 = 函数式编程 + 响应式编程 (1)函数式 函数式编程是...

  • iOS 函数编程 & 链式编程

    函数式(链式)编程 函数式编程概念 函数式编程是种编程范式 函数式编程 Functional Programmin...

  • Scala(三)-①-函数式编程和异常

    入门Scala(三)-① 函数式编程和异常 函数式编程 ① Why-为什么我们要学函数式编程.这种范式的目的 无目...

网友评论

      本文标题:Go 函数式编程(三)

      本文链接:https://www.haomeiwen.com/subject/qbcqyftx.html