首页 > 解决方案 > 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

标签: recursionstreamelixirgenerator

解决方案


解决方案似乎很简单:替换EnumStream.

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)

语言非常好。随心所欲的解决方案。除非我错过了什么,那就是:)。欢迎评论!


推荐阅读