List 是否可以选择将管道输出插入Elixir函数args的位置?

List 是否可以选择将管道输出插入Elixir函数args的位置?,list,functional-programming,pipeline,elixir,List,Functional Programming,Pipeline,Elixir,考虑一个(有味道的、非惯用的)函数,如下所示: 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 e

考虑一个(有味道的、非惯用的)函数,如下所示:

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)
这让我了解了大部分内容,但是我如何将输出导入最后一个
列表的匿名函数中。在
调用中更新\u?我可以将其嵌套在原始调用中,但这似乎是放弃:

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

您可以简单地绑定到一个变量以捕获第一个结果,然后在第二个
列表中替换它

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
您还可以使用运算符执行以下操作:

  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))).()
我发现使用变量更具可读性,但选项是存在的。

如何:

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

看起来容易些。

哈哈哈,没错。我正试图聪明地处理上述问题。@TrevorAlexander我还提供了一种不使用临时变量的方法。啊!我尝试过类似的方法,但没有捕获整个调用。或者,您可以创建一个私有函数,该函数以正确的顺序接收参数,然后执行调用。:)关于capture方法值得注意的是,它使您不必为函数或临时变量指定名称。但就我个人而言,我通常倾向于使用José提到的“接收参数的私有函数”。