是否可以减少 Elixir 中的流?
我看到 Stream.scan 但它不返回累加器。
file_stream
|> Stream.each(&parse_line/1)
|> Enum.reduce(&reduce_fn/2)
Run Code Online (Sandbox Code Playgroud)
我似乎遇到了以下问题,但想知道是否可以这样做?
减少流是没有意义的。Enum模块中的函数与模块中的函数之间的核心区别Stream是,前者是贪婪的,而后者是懒惰的。
也就是说,Stream生成一组转换,可以在每个集合\xe2\x80\x99s 元素基础上延迟应用,传递。
但是reduce(又名foldl)已经是一种有效的贪婪操作,如果不遍历整个集合就无法得到结果。(因此Stream.scan/3顺便说一句,这就是为什么不返回累积值的原因。)
枚举
\n# ===== code ===== ===== piped through =====\n[1, 2, 3] # [1, 2, 3]\n# # \xe2\x87\x93\n|> Enum.map(&IO.inspect/1) # [1, 2, 3]\n# # \xe2\x87\x93\n|> Enum.map(&IO.inspect/1) # [1, 2, 3]\n\n#\xe2\x87\x92 1 2 3 1 2 3\nRun Code Online (Sandbox Code Playgroud)\n溪流
\n# ===== code ===== ===== piped through =====\n[1, 2, 3] # 1 2 3\n# # \xe2\x87\x93 \xe2\x87\x93 \xe2\x87\x93\n|> Stream.map(&IO.inspect/1) # 1 2 3\n# # \xe2\x87\x93 \xe2\x87\x93 \xe2\x87\x93\n|> Stream.map(&IO.inspect/1) # 1 2 3\n|> Enum.to_list() # termination!\n# # \xe2\x87\x92 \xe2\x87\x92 \xe2\x87\x92\n\n#\xe2\x87\x92\xc2\xa01 1 2 2 3 3\nRun Code Online (Sandbox Code Playgroud)\n