如何在 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