我正在尝试使用管道运算符|>
的元组以及像
(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)
映射到F#
,语法应该是什么样的?
答案 0 :(得分:3)
如果没有流水线操作,您将在这种情况下使用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
答案 1 :(得分:1)
您可以为泛型函数|>
定义一个新方法,该方法接受一个参数元组并将其映射到函数的形式参数,如下所示:
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
答案 2 :(得分: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