如何在 Elixir 中展平嵌套列表?

How do I flatten a nested list in Elixir?

我有一个嵌套列表 [1, [2, [3, 4], 5], 6]。我怎样才能把它弄平,让它变成 [1, 2, 3, 4, 5, 6]?

defmodule Util do
  @doc """
  Flattens nested lists

  ## Examples
    iex> Util.flatten_nested([1, [2, [3, 4], 5], 6])
    [1, 2, 3, 4, 5, 6]
  """
  def flatten_nested(list, acc \ []),
    do: flatten_nested_rev(list, acc) |> Enum.reverse()

  @doc """
  Flattens nested lists, and returns a reversed list

  ## Examples
    iex> Util.flatten_nested_rev([1, [2, [3, 4], 5], 6])
    [6, 5, 4, 3, 2, 1]
  """
  def flatten_nested_rev(list, acc \ [])

  def flatten_nested_rev([], acc) do
    acc
  end

  def flatten_nested_rev([list | rest], acc) when is_list(list) do
    flatten_nested_rev(rest, flatten_nested_rev(list, acc))
  end

  def flatten_nested_rev([element | rest], acc) do
    flatten_nested_rev(rest, [element | acc])
  end
end

不用重新发明轮子,直接用List.flatten/1

iex(1)> List.flatten([1, [2, [3, 4], 5], 6])
[1, 2, 3, 4, 5, 6]

这是一个很好的旧递归方法(未优化尾调用)

defmodule Test do
  # degenerate case
  def flatten([]), do: []

  # list with more than 1 elt
  def flatten([ head | tail ]) do
    flatten(head) ++ flatten(tail)
  end
  
  # list with only one elt
  def flatten(head), do: [ head ]
done