recursion - Elixir:递归生成器
问题描述
是否可以使用 Elixir 构建 Python 风格的递归生成器?像这样的东西:
def traverse(parent_dir):
dirs, files = get_dirs_and_files_as_lists(parent_dir)
for d in dirs:
yield from traverse(d)
for f in files:
yield f
对于所有要线性处理的文件,没有不确定长度的急切列表所暗示的开销:
for f in traverse(dir):
process(f)
使用流应该可以实现这一点,或者一些等效的工作;不幸的是,我不知道怎么做。
我想要这样的东西,只是懒惰:
def traverse_eagerly(parent_dir) do
{dirs, files} = get_dirs_and_files_as_lists(parent_dir)
for x <- dirs do
traverse_eagerly(x)
end
|> Enum.concat()
|> Enum.concat(files)
end
解决方案
解决方案似乎很简单:替换Enum
为Stream
.
def traverse_lazily(parent_dir) do
{dirs, files} = get_dirs_and_files_as_lists(parent_dir)
for x <- dirs do
traverse_lazily(x)
end
|> Stream.concat()
|> Stream.concat(files)
end
以下按预期工作:
s = traverse_lazily(a_dir_of_choice)
for x <- s, do: whatever_you_please(x)
语言非常好。随心所欲的解决方案。除非我错过了什么,那就是:)。欢迎评论!
推荐阅读
- r - 如何防止统计密度干扰我的图例 - R?
- javascript - 字符串中的奇怪符号会破坏 JSON.parse,但似乎无法检测到?
- debugging - 为什么GDB在寄存器信息期间用5s填充内存地址的0?
- javascript - 为什么“产品快速查看”JavaScript 插件会影响非操作触发的部门?
- python - Pandas:根据多个其他列中的值填充空值
- reactjs - 玩笑测试模拟——在另一个函数中模拟获取
- python - 如何编写为我配置应用程序设置的脚本?
- c# - Nunit:测试遗留代码(私有无效)方法
- google-app-engine - gcloud deploy 不上传新文件
- reactjs - 根据反应键更改类名