Pipe 在Julia中,如何将管道操作符与元组和匿名函数一起使用?

Pipe 在Julia中,如何将管道操作符与元组和匿名函数一起使用?,pipe,tuples,anonymous-function,julia,Pipe,Tuples,Anonymous Function,Julia,我试图将元组与管道操作符|>以及一个匿名函数(如 (1,2)|>(x,y)->x^2+y^2 但收到错误消息时: wrong number of arguments while loading In[59], in expression starting on line 1 in anonymous at In[59]:1 in |> at operators.jl:178 显然,(1,2)元组没有映射到(x,y) 经过一点尝试,我意识到我可以通过 (1,2)|>x->x[1]^2

我试图将元组与管道操作符
|>
以及一个匿名函数(如

(1,2)|>(x,y)->x^2+y^2

但收到错误消息时:

wrong number of arguments
while loading In[59], in expression starting on line 1

 in anonymous at In[59]:1
 in |> at operators.jl:178
显然,
(1,2)
元组没有映射到
(x,y)

经过一点尝试,我意识到我可以通过

(1,2)|>x->x[1]^2+x[2]^2


但在某些情况下,后者不如前者优雅。如果我想将
(1,2)
映射到
(x,y)
,那么语法应该是什么样的?

在这种情况下,您将使用splat操作符

((x,y) -> x^2 + y^2)((1,2)...)
用流水线

julia> (1,2)...  |>  (x,y) -> x^2 + y^2
ERROR: MethodError: `|>` has no method matching |>(::Int32, ::Int32, ::Function)
所以可以扩展|>来处理两个参数

import Base.|>
|>(x,y,f) = f(x,y)


您可以为泛型函数
|>
定义一个新方法,该方法接受参数元组并将其映射到函数的形式参数,如下所示:

julia>Base.|>(xs::Tuple,f)=f(xs…)
|>(具有7种方法的通用函数)
朱莉娅:让我来
x=1
y=2
#只是胡闹。。。
(x,y)|>(x,y)->(2x,5y)|>
divrem>
复杂|>
x->(x.re,x.im)|>
divrem>
(x…)->[x…]|>
总和|>
浮动
结束
0

更一般的方法如何

|>(args…=args[end](args[1:end-1]…)

(1,2,3).|>(x,y,z)->x+y*z
计算结果为
7

不过,广播有点尴尬:

[(1,2)、(3,4)]。|>x->x…|>(x,y)->x+y

编辑:

定义

import Base.|>

|>(args...) = args[end](args[1:end-1]...)
→(x, y) = |>(x..., y)
允许你写作
[(1,2)、(3,4)]。→ (x,y)->x+y

这是一个。
import Base.|>

|>(args...) = args[end](args[1:end-1]...)
→(x, y) = |>(x..., y)