在 julia 中链接具有多个输出的函数
chaining functions with multiple outputs in julia
Julia 对使用 |>
的链接函数有很好的支持,比如
x |> foo |> goo
但是对于具有多个输入和多个输出的函数,这不起作用:
julia> f(x, y) = (x+1, y+1)
julia> f(1, 2)
(2, 3)
julia> (1,2) |> f |> f
ERROR: MethodError: no method matching f(::Tuple{Int64,Int64})
Closest candidates are:
f(::Any, ::Any) at REPL[3]:1
Stacktrace:
[1] |>(::Tuple{Int64,Int64}, ::typeof(f)) at ./operators.jl:813
[2] top-level scope at none:0
我们可以定义 f
接受元组使其工作。
julia> g((x,y)) = (x+1, y+1)
julia> (1,2) |> g |> g
(3, 4)
但是g
的定义不如f
清晰。在 julia 的文档中,我读到函数正在调用元组,但实际上存在差异。
有什么优雅的解决方案吗?
你也可以像这样使用 splatting operator ...
:
julia> f(x, y) = (x+1, y+1)
f (generic function with 1 method)
julia> (1,2) |> x->f(x...) |> x->f(x...)
(3, 4)
或者您可以使用数组
julia> f(x) = [x[1]+1,x[2]+1]
f (generic function with 1 method)
julia> [1,2] |> f |> f
2-element Array{Int64,1}:
3
4
Julia 对使用 |>
的链接函数有很好的支持,比如
x |> foo |> goo
但是对于具有多个输入和多个输出的函数,这不起作用:
julia> f(x, y) = (x+1, y+1)
julia> f(1, 2)
(2, 3)
julia> (1,2) |> f |> f
ERROR: MethodError: no method matching f(::Tuple{Int64,Int64})
Closest candidates are:
f(::Any, ::Any) at REPL[3]:1
Stacktrace:
[1] |>(::Tuple{Int64,Int64}, ::typeof(f)) at ./operators.jl:813
[2] top-level scope at none:0
我们可以定义 f
接受元组使其工作。
julia> g((x,y)) = (x+1, y+1)
julia> (1,2) |> g |> g
(3, 4)
但是g
的定义不如f
清晰。在 julia 的文档中,我读到函数正在调用元组,但实际上存在差异。
有什么优雅的解决方案吗?
你也可以像这样使用 splatting operator ...
:
julia> f(x, y) = (x+1, y+1)
f (generic function with 1 method)
julia> (1,2) |> x->f(x...) |> x->f(x...)
(3, 4)
或者您可以使用数组
julia> f(x) = [x[1]+1,x[2]+1]
f (generic function with 1 method)
julia> [1,2] |> f |> f
2-element Array{Int64,1}:
3
4