如何使用管道运算符将参数传递给匿名函数?

时间:2016-06-12 09:02:27

标签: elixir

我正在玩Elixir。只是想知道是否可以使用管道|>运算符将参数传递给匿名函数。这就是我的意思。

a = [1,2,3] #=> [1,2,3]
m = fn ([h|t]) -> [ h*h | m.(t) ] end #=> head squared and call m with tail.  Not sure how to use & shortcut for this.
m.(a) #=> [1,4,9]
a |> m #=> undefined function m/1 (understood. Arity is 1)
a |> m.(&1) #=> unhandled &1 outside of capture

3 个答案:

答案 0 :(得分:3)

您可以将匿名函数传递给管道,例如

 m = fn(x) -> x * x end # Function<6.50752066/1 in :erl_eval.expr/5>
 3 |> m.() # 9 

好像你在匿名函数中进行递归调用是不可能的。行m = fn ([h|t]) -> [ h*h | m.(t) ]将导致执行错误。

为了使这个工作,您可以传递与另一个参数相同的函数,或者您可以使用我更喜欢的命名函数,因为它看起来更清楚。

m = fn ([h|t],my_func) -> [ h*h | my_func.(t) ] end
a |> m.(m)

答案 1 :(得分:2)

错误是由基本条件产生的,其中没有参数,它不能被分区为[H | T]。

a = [1,2,3] #=> [1,2,3]
m = fn
  ([],_) -> []
([h|t], fun) -> [ h*h | fun.(t, fun)]
end

b = m.(a,m)

IO.inspect b #=> [1, 4, 9]

<强>更新

其他不同之处在于函数本身本身是未知的,因此需要传递它作为参数(有趣)。

答案 2 :(得分:1)

也许这样

a |> (&m.(&1))