我正在玩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
答案 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))