使用带过滤器的管道并在灵药中

时间:2015-11-09 11:56:17

标签: 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)

导致此错误:      **(FunctionClauseError)在Enumerable.Function.reduce / 3

中没有匹配的函数子句

但是过滤器和地图操作都是孤立的。

Enum.filter params, fn {k, v} -> k == v end 
Enum.map(params, fn {k, v} -> {k, v} end)

他们在管道输送时无法工作。

我确信我遗漏了一些明显的东西。

1 个答案:

答案 0 :(得分: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)

请参阅Why Can't I Chain String.replace?以获取更详细的说明。