【问题标题】:Is it possible to choose where the pipe output is inserted into Elixir function args?是否可以选择管道输出插入 Elixir 函数 args 的位置?
【发布时间】:2019-03-10 00:34:24
【问题描述】:

考虑一个(难闻的,非惯用的)函数,如下所示:

def update_2d(array, inds, val) do
    [first_coord, second_coord] = inds

    new_arr = List.update_at(array, second_coord, fn(y) ->
      List.update_at(Enum.at(array, second_coord),
        first_coord, fn(x) -> val end) end)
end

此函数将接收一个列表列表、一个包含两个索引的列表以及一个要插入到列表列表中由索引指定的位置的值。

作为使这个更灵丹妙药的第一步,我开始铺设管道:

array 
  |> Enum.at(second_coord) 
  |> List.update_at(first_coord, fn(x) -> val end)

这让我了解了大部分情况,但是我如何将该输出通过管道传输到最后一个 List.update_at 调用的匿名函数中?我可以将它嵌套在原始调用中,但这似乎喜欢放弃:

List.update_at(array, second_coord, fn(y) -> 
  array 
  |> Enum.at(second_coord) 
  |> List.update_at(first_coord, fn(x) -> val end) 
end) 

【问题讨论】:

    标签: list functional-programming pipeline elixir


    【解决方案1】:

    您可以简单地绑定到一个变量来捕获您的第一个结果,然后在第二个 List.update_at/3 调用中替换它

    def update_2d(array, inds = [first_coord, second_coord], val) do
      updated =
        array
        |> Enum.at(second_coord) 
        |> List.update_at(first_coord, fn(x) -> val end)
    
        List.update_at(array, second_coord, fn(x) -> updated end)
    end
    

    您也可以使用capture 运算符来执行此操作:

      def update_2d(array, inds = [first_coord, second_coord], val), do:    
        array
        |> Enum.at(second_coord) 
        |> List.update_at(first_coord, fn(x) -> val end)
        |> (&(List.update_at(array, second_coord, fn(y) -> &1 end))).()
    

    我发现使用变量更具可读性,但选项就在那里。

    【讨论】:

    • 哈哈哈,原来如此。我试图对上述内容如此聪明。
    • @TrevorAlexander 我还提供了一种无需临时变量的方法。
    • 啊!我正在尝试类似的事情,但我没有捕捉到整个通话。
    • 或者,您可以创建一个私有函数,以正确的顺序接收参数,然后执行调用。 :)
    • 关于捕获方法值得注意的是,它使您不必想出名称(对于函数或临时变量)。但就我个人而言,我通常倾向于使用 José 提到的“接收参数的私有函数”。
    【解决方案2】:

    怎么样:

    {:foo, :bar} |> elem(1) |> Enum.Map(fn x -> x end)
    

    似乎更容易。

    【讨论】:

      猜你喜欢
      • 2019-08-09
      • 2019-10-11
      • 1970-01-01
      • 2016-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-01
      • 1970-01-01
      相关资源
      最近更新 更多