美文网首页
高阶函数、闭包、柯里化--julia例子

高阶函数、闭包、柯里化--julia例子

作者: 昵称违法 | 来源:发表于2020-03-23 23:05 被阅读0次

高阶函数及闭包

【本文来源:(https://juliabook.josephjctang.com/content/ch3/first_class_function.html)】

在本节中,我们将展示Julia 函数的奇妙与灵活。首先,函数有自己的类型在REPL键入typeof(mult) 返回Function 。函数也可以被赋值给一个变量:

julia> m = mult 
julia> m(6, 6) #> 36

这在匿名函数的使用过程中非常有用,如c = x -> x + 2, 或:

julia> plustwo = function (x)
                     x + 2
                 end
(anonymous function)
julia> plustwo(3)
5

操作符也是一个函数,只是它写在两个参数中间而已,形如x + y 等价于 +(x, y) 。实际上,执行时第一种形式会被解析成第二种形式。我们可以在REPL确认 +(3, 4) 返回7 和 而typeof(+)返回Function

一个函数的参数可以是另外一个函数 ( 或多个函数), 如后定义的一个函数计算另一个函数f 的梯度 :

function numerical_derivative(f, x, dx=0.01)
  derivative = (f(x+dx) - f(x-dx))/(2*dx)
  return derivative
end

上面这个函数就可以把匿名函数f 当作一个参数做如后调用numerical_derivative(f, 1, 0.001):

f = x -> 2x^2 + 30x + 9
println(numerical_derivative(f, 1, 0.001)) #> 33.99999999999537

函数的返回值也可以是另一个函数(或多个函数) 。如后代码中的函数返回值就是一个计算梯度的函数。

function derivative(f)
    return function(x)  
  # pick a small value for h
        h = x == 0 ? sqrt(eps(Float64)) : sqrt(eps(Float64)) * x
        xph = x + h
        dx = xph - x
        f1 = f(xph) # evaluate f at x + h
        f0 = f(x) # evaluate f at x
        return (f1 - f0) / dx  # divide by h
    end
end

如我们所见,上面都是比较好的匿名函数的实例。而如后则是返回返回两个匿名函数的例子:

function counter()
    n = 0
    () -> n += 1, () -> n = 0
end

我们可以将返回的函数赋值给另外的变量:(addOne, reset) = counter();也注意到上例中n 是一个局部变量:

julia> n
ERROR: n not defined

当我们反复调用 addOne 时可见到如后结果:

addOne() #=> 1
addOne() #=> 2
addOne() #=> 3
reset()  #=> 0

如我们所见,在counter 函数里 , 变量 n 只在匿名函数中使用,亦即只可在addOnereset中操作。这两个函数都是封闭式的使用 n,这就是为什么叫这闭包 。

柯里化(Currying, 也称偏函数应用PF)是指:将一个多参数函数调用,变成一系列的单参数函数调用。下面是函数柯里化的例子:

function add(x)
    return function f(y)
        return x + y
    end
end

上例输出将是add (generic function with 1 method)。调用add(1)(2)得3。上例可更简洁地写作add(x) = f(y) = x + y。或者加入一个匿名函数 则为add(x) = y -> x + y。传递函数时柯里化是非常有用的,后面讲解 Map, filters, list comprehensions 的章节也将用到。

PF. Partial Function

相关文章

  • 高阶函数、闭包、柯里化--julia例子

    高阶函数及闭包 【本文来源:(https://juliabook.josephjctang.com/content...

  • React基础篇之高阶函数&函数柯里化

    高阶函数 函数柯里化

  • 函数柯里化

    函数柯里化(currying) 我们假设在查看本文档前,您已经有了一定的js基础,并对高阶函数,闭包,call&&...

  • [ Swift ] 高阶函数

    高阶函数就是传递一个匿名闭包参数;使用高阶函数可以节省很多代码,也使代码更易读,总之很酷。看下面例子。 例子 求出...

  • Python笔记四 装饰器

    装饰器 = 高阶函数+函数嵌套+闭包 高阶函数 = 参数 or 返回值为函数 函数嵌套 = 在函数中定义函数 闭包...

  • 高阶函数 --> 函数的柯里化,闭包,回调函数

    回调函数: 把一个函数当前另外一个函数的参数,在另外一个函数内被执行和传递参数1.解决异步2.函数的功能扩展/函数...

  • 初学函数式编程

    高阶函数(Higher-Order Function):高阶函数就是把函数作为参数的函数。 柯里化(Curryin...

  • javascript-柯里化2018-08-08

    柯里化 / 高阶函数 柯里化:将 f(x,y) 变成 f(x=1)(y) 或 f(y=1)x 重点!!!柯里化可以...

  • 函数柯里化

    函数柯里化,用于创建已经设置好了一个或多个参数的函数。函数柯里化的基本方法和函数绑定是一样的:使用一个闭包返回一个...

  • Python 进阶语法

    高阶函数 python 的高阶函数非常 Nice,高级函数的核心就是闭包{},闭包就可以把一段{}包裹的代码当成对...

网友评论

      本文标题:高阶函数、闭包、柯里化--julia例子

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