2016-06-12 74 views
1

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

'米= FN([H | T]) - > [H * H | m。(t)]'会出错 – coderVishal

回答

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] 

UPDATE

其他的区别在于功能的本身,本身就是未知的,因此将它作为参数(FUN)是必需的。

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