функции сцепления с несколькими выходами в Юлии - PullRequest
0 голосов
/ 25 августа 2018

Джулия имеет хорошую поддержку для создания цепочек функций, используя |> как

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. В документе про Джулию я читал, что функции вызывают кортежи, но на самом деле есть различия.

Есть ли какое-нибудь элегантное решение для этого?

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

или вы можете использовать массив

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
0 голосов
/ 25 августа 2018

Вы также можете использовать оператор разбрызгивания ..., например:

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)
...