使用带过滤器的管道并在elixir中映射

Tob*_*ede 7 functional-programming elixir

我试图从Elixir中的地图中过滤掉一些值.

这个:

params = %{"blah" => "blah", "vtha" => "blah"}
params 
  |>  Enum.filter fn {k, v} -> k == v end 
  |>  Enum.map(fn {k, v} -> {k, v} end)
Run Code Online (Sandbox Code Playgroud)

导致此错误:**(FunctionClauseError)在Enumerable.Function.reduce/3中没有匹配的函数子句

但是过滤器和映射操作都是孤立的.

Enum.filter params, fn {k, v} -> k == v end 
Enum.map(params, fn {k, v} -> {k, v} end)
Run Code Online (Sandbox Code Playgroud)

它们在管道输送时不起作用.

我相信我错过了一些明显的东西.

Gaz*_*ler 11

编辑在Elixir的主分支上,如果存在参数,编译器将警告函数是否在没有括号的情况下被管道输入.


您需要显式括号,Enum.filter因为函数调用具有比管道运算符更强的优先级.

params = %{"blah" => "blah", "vtha" => "blah"}
params 
  |>  Enum.filter(fn {k, v} -> k == v end)
  |>  Enum.map(fn {k, v} -> {k, v} end)
Run Code Online (Sandbox Code Playgroud)

请参阅为什么我不能链String.replace?有关更详细的解释.