【问题标题】:Uppercase in name of a function in JuliaJulia中函数名称的大写
【发布时间】:2021-09-16 18:36:22
【问题描述】:

我对 Julia 很陌生,对以下代码感到困惑。定义函数 LucasTree 后,它再次用作 lt。 Julia 是否有某种角色可以让我使用大写缩写来调用函数?如果是这样,我在哪里可以找到此功能的不错参考?

function LucasTree(;γ = 2.0,
                   β = 0.95,
                   α = 0.9,
                   σ = 0.1,
                   grid_size = 100)

   ϕ = LogNormal(0.0, σ)
   shocks = rand(ϕ, 500)

   # build a grid with mass around stationary distribution
   ssd = σ / sqrt(1 - α^2)
   grid_min, grid_max = exp(-4ssd), exp(4ssd)
   grid = range(grid_min, grid_max, length = grid_size)

   # set h(y) = β * int u'(G(y,z)) G(y,z) ϕ(dz)
   h = similar(grid)
   for (i, y) in enumerate(grid)
       h[i] = β * mean((y^α .* shocks).^(1 - γ))
   end

   return (γ = γ, β = β, α = α, σ = σ, ϕ = ϕ, grid = grid, shocks = shocks, h = h)
end
function lucas_operator(lt, f)

    # unpack input
    @unpack grid, α, β, h = lt
    z = lt.shocks

    Af = LinearInterpolation(grid, f, extrapolation_bc=Line())

    Tf = [ h[i] + β * mean(Af.(grid[i]^α .* z)) for i in 1:length(grid) ]
    return Tf
end

【问题讨论】:

  • 函数名中的大写字母通常保留给Constructors,尽管这绝不是强制的。但是,您发布的代码中的LucasTree 函数似乎向我返回了NamedTuple,这很奇怪。我原以为它会返回 LucasTree 类型的实例(其中类型定义将在包中的其他位置)。第二个函数中的lt 是某种类型的实例(可能是LucasTree),其中有一个字段shocks。你能指出这段代码来自哪里吗?
  • 顺便说一句,关于:“Julia 是否有某种角色,我可以使用大写缩写来回忆一个函数?”,答案是否定的,至少对于 Base julia 来说不是。这种行为可能会通过适当的宏在包中实现,但我以前没有见过。
  • 我认为这段代码中的lt 只是调用LucasTree 的输出,例如lt = LucasTree()lt = LucasTree(α = 1.5)
  • 有时命名元组被用作一种“轻量级”结构,而不是定义一个实际的结构类型(我的意思是轻量级,因为易于定义和修改,性能是一样的)。我想这就是LucasTree 正在做的事情。在开发的后期,可能会定义一个完整的类型。
  • Julia 当然没有通过缩写来引用函数的功能。那将是一个可怕的功能。而且我在代码中看不到类似的东西。标识符lt 只是一个普通的变量名,就像所有变量一样使用。如果变量被称为x,代码的工作方式完全相同,它只是被称为lt 以表明它通常包含一个LucasTree 对象(我假设),然后lt 比@ 更“助记符” 987654340@.

标签: function julia uppercase


【解决方案1】:

不,这不存在。这太不独特了,不实用,而且按照惯例,Julia 中的函数名称​​应该完全小写(结构/类型可以是 CamelCase,但不能是函数,构造函数可能除外*)。

无论如何,您发布的代码中发生的所有事情都是函数lucas_operator 接受两个参数ltf,然后可以在lucas_operator 函数中使用它们。这些原则上可以是任何东西,无论它们在函数范围之外被命名为什么,它们都将在函数范围内命名为ltf。比如:

function example(foo, bar)
    return foo(2*bar)
end

如果你再打电话

example(somereallylongfunctionname, somevariable)

那么这将返回等价于

somereallylongfunctionname(2*somevariable)

或类似

example(SomeImproperlyCapitalizedFunction, somevariable)
# equivalent to SomeImproperlyCapitalizedFunction(2*somevariable)

在任何一种情况下,无论其名称在 example 函数范围之外如何,传递给函数的第一个参数在函数内都将称为 foo

* 除了构造函数:那将是一个用于构造自定义类型的函数。这完全不会这样做,但它确实返回了一个 NamedTuple 的实例,然后在后续代码中似乎有点像类型/结构,所以也许它可以算作构造函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-21
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    • 2022-06-30
    • 2023-03-14
    相关资源
    最近更新 更多