如何在 Julia 中使用带有元组和匿名函数的管道运算符?
How to use the pipe operator with tuples and anonymous functions in 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 + x[2]^2
但后者在某些情况下不如第一种方式优雅。如果我想以第一种 F#
方式将 (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> (1,2)... |> (x,y) -> x^2 + y^2
5
您可以为通用函数 |>
定义一个新方法,该方法采用参数元组并将其映射到函数的形式参数,如下所示:
julia> Base.|>(xs::Tuple, f) = f(xs...)
|> (generic function with 7 methods)
julia> let
x = 1
y = 2
# just messing around...
(x, y) |> (x, y) -> (2x, 5y) |>
divrem |>
complex |>
x -> (x.re, x.im) |>
divrem |>
(x...) -> [x...] |>
sum |>
float
end
0.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
我正在尝试将元组与管道运算符一起使用,|>
以及一个匿名函数,如
(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
但后者在某些情况下不如第一种方式优雅。如果我想以第一种 F#
方式将 (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> (1,2)... |> (x,y) -> x^2 + y^2
5
您可以为通用函数 |>
定义一个新方法,该方法采用参数元组并将其映射到函数的形式参数,如下所示:
julia> Base.|>(xs::Tuple, f) = f(xs...)
|> (generic function with 7 methods)
julia> let
x = 1
y = 2
# just messing around...
(x, y) |> (x, y) -> (2x, 5y) |>
divrem |>
complex |>
x -> (x.re, x.im) |>
divrem |>
(x...) -> [x...] |>
sum |>
float
end
0.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