【发布时间】: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@.