【问题标题】:Lua - Higher-order Derivative functionLua - 高阶导数函数
【发布时间】:2014-05-13 20:52:25
【问题描述】:

返回函数在 Lua 中是如何工作的?我正试图围绕这个导数函数展开思考,但我无法理解它。

function derivative(f, delta)
  delta = delta or 1e-4
  return function(x)
      return (f(x + delta) - f(x))/delta
    end
end

感谢您的帮助。

【问题讨论】:

  • 你明白anonymous functions吗?
  • 我相信是的。匿名函数只是一个没有变量名的函数?我知道函数是一等值,其处理方式与字符串/数字相同,但在我的示例中,我无法理解如何在匿名函数中处理 x 参数。
  • 真的,在 Lua 中,所有的函数都是匿名的。只有编译的调试信息和运行时调试信息会尝试为函数命名,以便在错误消息和调用堆栈中的调试信息中使用。

标签: function lua higher-order-functions


【解决方案1】:

第一个see here

简而言之,函数是一等公民,您可以将它们存储在变量中并从函数返回。

第二。在您的示例中,需要创建一个闭包。它将具有上值 f 和 delta,可用于内部函数。

因此,当您调用派生函数时,将使用 f 和 delta 的副本创建新的闭包。你可以像任何其他函数一样稍后调用它

local d = derivative(f, 1e-6)
d(10)

编辑:“回答,但我无法理解在我的示例中如何在匿名函数中处理 x 参数”

每个函数都有一个签名,几个正式的属性,它会得到。 在 Lua 中,您可以使用任意数量的参数调用函数。让我们考虑一个例子。

local a = function(x1, x2) print(x1, x2) end
a(1) // 1, nil
a(1, 2) // 1, 2
a(1, 2, 3) // 1, 2

当你调用变量a中的函数时,每个给定的参数值,都会与函数argumentList一一匹配。在第三个示例中,1 将分配给 x1,2 分配给 x2,3 将被丢弃。在 vararg 函数的术语中,将执行这样的操作。

function a(...)
  local x1 = (...)[1]
  local x2 = (...)[2]
  // Body
end

在您的示例中,x 被视为内部函数参数,将在其中可见,并在您调用内部函数实例时进行初始化。

fdelta 对于每个函数实例都是唯一的,正如我上面提到的。

希望我笨拙的解释能达到他们的目标并帮助你一点。

【讨论】:

  • 所以为了得到导数,我将函数分配给一个变量,并且可以使用返回函数中的 x 参数调用该变量?
  • @aioko 稍微改进了答案。希望对您有所帮助。
猜你喜欢
  • 1970-01-01
  • 2016-05-07
  • 1970-01-01
  • 2021-04-27
  • 2019-09-22
相关资源
最近更新 更多