如何在Julia中使用具有元组和匿名函数的管道运算符?

时间:2015-08-28 17:44:45

标签: 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 + x[2]^2

但后者并不像某些情境中的第一种方式那样优雅。如果我想以(1,2)方式将(x,y)映射到F#,语法应该是什么样的?

3 个答案:

答案 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