functional-programming - 在 elixir 中使用带有过滤器和映射的管道

标签 functional-programming elixir

我试图从 Elixir 的 map 中过滤掉一些值。

这个:

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)

管道输送时它们不起作用。

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

最佳答案

编辑 在 Elixir 的 master 分支上,如果有参数,则编译器将警告是否将函数通过管道传递给不带括号的函数。

您需要为 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?以获得更详细的解释。

关于functional-programming - 在 elixir 中使用带有过滤器和映射的管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33608568/

相关文章:

programming-languages - 懒惰作为内置语言功能的实际用途是什么?

Haskell 回溯

bash - 仅打印其参数的函数是纯函数吗?

erlang - Elixir File.read在访问/proc/cpuinfo时返回空数据

javascript - 需要一些关于如何在 JavaScript 中使用函数式编程来重用函数的想法

scala - 我可以使用 monad 转换器来简化这个组合吗?

elixir - 使用 Phoenix/Ecto 显示数据库中的最后一条记录

postgresql - 如何通过 SSL 从 Phoenix Web App 连接到 PostgreSQL?

testing - 如何使 Elixir 混合测试输出更详细?

elixir - 通过推导式确定范围问题