我正在尝试写一个 curry function在 lua 5.2 中。我的代码如下所示:
function add(a, b)
return a + b
end
function curry(func, value)
return (function (...)
return func(value, table.unpack(arg))
end)
end
add2 = curry(add, 2)
print(add2(3))
然而,参数 arg
不包含传递给 add2 函数的值。
当我尝试运行 Lua documentation 中的示例时它出错,因为 arg 为零。
printResult = ""
function print (...)
for i,v in ipairs(arg) do -- arg is nil
printResult = printResult .. tostring(v) .. "\t"
end
printResult = printResult .. "\n"
end
如果这不起作用,我如何在 5.2 中使用可变长度函数?
编辑:
正如用户@siffiejoe 所指出的,我这里的功能只是进行部分应用,而不是适当的柯里化(Currying)。这是我使用已接受答案中的错误修复在 lua 中实现了正确的 curry 函数。
function curry(func, params)
return (function (...)
local args = params or {}
if #args + #{...} == debug.getinfo(func).nparams then
local args = {table.unpack(args)}
for _,v in ipairs({...}) do
table.insert(args, v)
end
return func(table.unpack(args))
else
local args = {table.unpack(args)}
for _,v in ipairs({...}) do
table.insert(args, v)
end
return curry(func, args)
end
end)
end
最佳答案
从 Lua 5.1 开始,arg
在这个上下文中被替换为 ...
(除了后者是列表而不是表格)。
所以,table.unpack(arg)
应该只是 ...
。
参见 Breaking Changes . Lua 引用手册非常好,这部分尤其有用。
关于Lua 变长函数参数为 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38749099/