在Julia中,为什么函数的作用域规则与其他第一类对象相比显得不一致?

时间:2018-08-13 13:16:34

标签: julia first-class-functions

Julia文档指出函数是第一类对象。我理解这意味着我应该能够像处理旧数据类型一样使用和定义它们。

因此我很惊讶

function a(b::Int64)
    if b > 0
        c = 1
    else
        c = -1
    end
end
a(2)

美观,而

function d(e::Int64)
    if e > 0
        println("Positive argument")
        function f()
            println("Return positive")
            return e
        end
    else
        println("Negative argument")
        function f()
            println("Return negative")
            return e
        end
    end
    return f
end

使用时可以正常工作,但是却有些反常的感觉:

>>> g = d(2)
Positive argument
(::f) (generic function with 1 method)
>>> g()
Return negative
2

或者:

>>> g = d(-2)
Negative argument
ERROR: UnderVarError: f not defined

这也许比返回意外事件更有用,但更令人困惑。

我希望从相应分支返回f的版本。我对Julia中的函数定义如何出错的理解在哪里?

2 个答案:

答案 0 :(得分:6)

我可以向您展示如何解决该问题,但是您描述的实际行为是一个已知问题https://github.com/JuliaLang/julia/issues/15602

通常,如果您这样做:

function d(e::Int64)
    if e > 0
        println("Positive argument")
        f = function()
            println("Return positive")
            return e
        end
    else
        println("Negative argument")
        f = function()
            println("Return negative")
            return e
        end
    end
    return f
end

一切正常。区别在于,您创建了一个匿名函数并将其分配给变量。

答案 1 :(得分:0)

在代码中,您两次定义了相同的函数f, 即使它位于“ if then else”结构的不同部分

我认为您可以通过执行此操作来解决

function d(e::Int64)
    if e > 0
        println("Positive argument")
        function Alpha()
            println("Return positive")
            return e
        end
        return Alpha
    else
        println("Negative argument")
        function Beta()
            println("Return negative")
            return e
        end
        return Beta
    end
end