我想在lua 5.2中写一个curry function。我的代码如下所示:
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为nil。
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
答案 0 :(得分:6)
由于Lua 5.1,此上下文中的arg
已被...
取代(除了后者是列表而不是表)。
因此,table.unpack(arg)
应该只是...
。
见Breaking Changes。 Lua参考手册非常好,特别是这一部分非常有用。