2015-08-28 41 views
2

我想使用的元组与管道运营商,|>一个匿名函数一起像如何在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),语法应该是什么样子?

+0

这是一个[相关Google-Groups讨论](https://groups.google.com/forum/#!topic/julia-dev/q_mPbNwVXi0)。 – Jubobs

回答

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 
3

无需流水线,你会使用图示运营商在这种情况下

((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 
相关问题