【问题标题】:How to pass arguments to anonymous functions using pipe operator?如何使用管道运算符将参数传递给匿名函数?
【发布时间】:2017-04-20 22:25:41
【问题描述】:

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

【问题讨论】:

  • m = fn ([h|t]) -> [ h*h | m.(t) ] 会报错

标签: elixir


【解决方案1】:

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

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

您似乎在匿名函数内进行递归调用,这是不可能的。行m = fn ([h|t]) -&gt; [ h*h | m.(t) ] 将导致执行错误。

要完成这项工作,您可以将相同的函数作为另一个参数传递,也可以使用我更喜欢的命名函数,因为它看起来更清晰。

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

【讨论】:

    【解决方案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]
    

    更新

    另一个区别是函数本身是未知的,因此需要将其作为参数(有趣)传递。

    【讨论】:

      【解决方案3】:

      也许这样

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

      【讨论】:

        猜你喜欢
        • 2014-08-26
        • 2018-06-07
        • 2011-07-29
        • 2015-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多