如何在 Lua 中编写 sum(f,n) 的高阶函数?

How would I write an higher-order function of sum(f,n) in Lua?

首先,我当然知道严格来说Lua不支持高阶函数,只支持first-class函数。

但是,我想尝试实现某种函数,对于给定函数和数字 n >= 0,returns 和 0 + f 1 + ... + f n .我的尝试方式如下所示:

function sum(f,n)
    if n < 1 
then 
    return 0
else
    return sum(f, n-1) + f(n)
    end
end

我不确定当我尝试调用它时它是否真的做了它应该做的事情:

print(sum(function(x) return x*x end, 2),3)

First of all, I am of course aware that strictly speaking Lua does not support higher order functions, but only first-class functions.

这是错误的。 Lua 的函数是“first-class” 允许 higher-order 函数:您可以简单地将函数作为参数传递。

I'm not sure though if it really does what it should do when I try to call it: print(sum(function(x) return x*x end, 2),3)

在 Lua REPL 中调用它,我得到了期望的结果 5 = 1^2 + 2^2:

$ lua
Lua 5.3.4  Copyright (C) 1994-2017 Lua.org, PUC-Rio
> function sum(f,n)
>>     if n < 1 
>> then 
>>     return 0
>> else
>>     return sum(f, n-1) + f(n)
>>     end
>> end
> 
> print(sum(function(x) return x*x end, 2),3)
5   3

虽然我不明白 , 3 的目的(它最终作为 print 的额外参数)。

更有效的实现是使用 for 循环而不是递归:

function sum(f, n)
    local sum = 0
    for i = 1, n do
        sum = sum + f(i)
    end
    return sum
end