Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Functional programming 在Lua中调用作为参数传递的函数_Functional Programming_Lua - Fatal编程技术网

Functional programming 在Lua中调用作为参数传递的函数

Functional programming 在Lua中调用作为参数传递的函数,functional-programming,lua,Functional Programming,Lua,我有这个密码 Option = { } function Option.nothing( ) local self = { isNone = true, isSome = false } function self:orElse( alt ) return alt end function self:map( f ) return Option.nothing( ) end function self:exec( f ) end fun

我有这个密码

Option = { }


function Option.nothing( )
  local self = { isNone = true, isSome = false }

  function self:orElse( alt )
    return alt
  end

  function self:map( f )
    return Option.nothing( )
  end

  function self:exec( f )
  end

  function self:maybe( alt, f )
    return alt
  end

  return self
end



function Option.just( val )
  local self = { isNone = false, isSome = true }
  local value = val

  function self:orElse( alt )
    return value
  end

  function self:map( f )
    return Option.just( f(value) )
  end

  function self:exec( f )
    f( value )
  end

  function self:maybe( alt, f )
    return f(value)
  end

  return self
end



function printOpt( opt )
  local str = opt.maybe( "Nothing", function(s) return "Just " .. s end )
  print( str )
end


x = Option.nothing( )
y = Option.just( 4 )

printOpt(x)
printOpt(y)
但我在这里不断得到“尝试调用本地“f”(一个nil值):


似乎调用作为参数传递的函数时遇到问题。

您将函数声明为
self:maybe()
,但您将其调用为
opt.maybe()
。您应该将其命名为
opt:maybe()

将其声明为
self:maybe(alt,f)
相当于将其声明为
self.maybe(self,alt,f)
。因此,如果使用
调用它,则需要3个参数。您正在传递2,因此
self
将作为
“Nothing”
,而
alt
将作为函数对象


但是,将其称为
opt:maybe(“Nothing”,f)
相当于说
opt.maybe(opt,“Nothing”,f)
,它提供了所需的3个参数。

Mike,如果您要编辑我的代码,请确保您实际上是正确的。
maybe()
的第一个参数,即
self
,确实获得了值
“Nothing”
。它不会得到
nil
。如果您感到困惑,OP源代码中对
opt.maybe()
的一次调用将其称为
opt.maybe(“Nothing”,函数)…end)
  function self:maybe( alt, f )
    return f(value)
  end