Lua 变长函数参数为 nil

标签 lua null functional-programming variadic-functions

我正在尝试写一个 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

欢迎调用suggest changes and add test cases here

最佳答案

从 Lua 5.1 开始,arg 在这个上下文中被替换为 ...(除了后者是列表而不是表格)。

所以,table.unpack(arg) 应该只是 ...

参见 Breaking Changes . Lua 引用手册非常好,这部分尤其有用。

关于Lua 变长函数参数为 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38749099/

相关文章:

pointers - 如何返回自定义错误而不导致 nil 值出现问题

functional-programming - 如何用像 K(或 Q)这样的函数式、基于数组的语言来表达这个命令式函数?

android - 任何优秀的文本编辑器 - Android 应用程序 - 为程序员优化?

multidimensional-array - 嵌套数组lua的长度

sql - 在排除 SQL 中的某些字段的同时对字段求和

algorithm - 哪些算法难以用函数式语言实现?

scala - 为什么在 foldLeft 中留下点会导致编译错误?

mysql - Lua 和 SQL 语法错误

path - Lua - 将包路径直接指向父目录中的另一个文件夹

ios - 在 Swift 中获取嵌套包装变量的值