我是Elixir的新手,正在学习和阅读有关列表/枚举用法和函数管道的知识。
我学习了如何结合Enum.map
和Enum.each
,例如处理列表的内容并打印结果列表以通过控制台进行
people = ["Qui", "Quo", "Qua"]
people
|> Enum.map(&String.upcase/1)
|> Enum.map(&Hello.hello/1)
|> Enum.each(&IO.puts/1)
我想知道它是否存在将Enum.map
和Enum.each
组合在一起的库函数:我的想法是为列表的每个元素 AND 做一些事情未修改的列表,以便继续进行管道函数调用。
当然,我可以在传递给Enum.map
的函数中添加副作用,但是我不太喜欢这种方法,我希望将副作用与 functional 转换明确分开。
我阅读了Enum
和List
文档,但我不知道该怎么做:Enum.each
返回:ok
,但找不到返回初始值的类似内容列表。
所以我自己实现了如下:
defmodule MyEnum do
def tee list, action do
Enum.map(list, fn item ->
action.(item)
item
end)
end
end
( 免责声明:当然,我给map
添加了副作用,但我将此 dirtyness 隔离到一个函数中,该函数的名称应阐明我的意图。 ),并将前面的示例重写为
people = ["Qui", "Quo", "Qua"]
people
|> Enum.map(&String.upcase/1)
|> Enum.map(&Hello.hello/1)
|> MyEnum.tee(&IO.puts/1)
|> Enum.map(&String.upcase/1)
|> Enum.each(&IO.puts/1)
我工作(对我来说,编写这段代码对我来说非常有用),但是我想知道
谢谢!
答案 0 :(得分:2)
Stream.each会做您想要的,但是您需要消耗流以触发效果。
为每个项目执行给定的功能。
用于在流中添加副作用(如打印)。
people
|> Enum.map(&String.upcase/1)
|> Stream.each(&IO.inspect/1)
|> Enum.to_list