Эликсир: Как выглядит понимание списка с несколькими генераторами без синтаксического сахара? - PullRequest
0 голосов
/ 02 июня 2018

Я пытаюсь понять списки в Эликсире.

Пример, на который я смотрю, - это перестановка строк из этого ответа .

def shuffle([], _), do: [[]]
def shuffle(_,  0), do: [[]]
def shuffle(list, i) do
  for x <- list, y <- shuffle(list, i-1), do: [x|y]
end

Как выглядит это понимание двойного генератора, когда переписано без понимания?Я попытался реализовать алгоритм самостоятельно , но моя реализация добавляется в список, а не добавляется, как при понимании.Я хочу написать алгоритм без понимания, но с идентичным поведением.

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Пример использования Догберта с заменой flat_map на map действительно помог мне понять, что происходит:

iex(1)> Permute.shuffle(~w(A B C), 3)
[
  [
    ["A", ["A", ["A"]], ["A", ["B"]], ["A", ["C"]]],
    ["A", ["B", ["A"]], ["B", ["B"]], ["B", ["C"]]],
    ["A", ["C", ["A"]], ["C", ["B"]], ["C", ["C"]]]
  ],
  [
    ["B", ["A", ["A"]], ["A", ["B"]], ["A", ["C"]]],
    ["B", ["B", ["A"]], ["B", ["B"]], ["B", ["C"]]],
    ["B", ["C", ["A"]], ["C", ["B"]], ["C", ["C"]]]
  ],
  [
    ["C", ["A", ["A"]], ["A", ["B"]], ["A", ["C"]]],
    ["C", ["B", ["A"]], ["B", ["B"]], ["B", ["C"]]],
    ["C", ["C", ["A"]], ["C", ["B"]], ["C", ["C"]]]
  ]
]
0 голосов
/ 02 июня 2018

Понимание без фильтров может быть преобразовано в последовательность Enum.flat_map и Enum.map.В частности, все, кроме последнего, станут flat_map, а последний станет map.Вот перевод вашего кода:

list
|> Enum.flat_map(fn x ->
  shuffle(list, i - 1)
  |> Enum.map(fn y ->
    [x | y]
  end)
end)

Я тестировал с A.shuffle([1, 2, 3, 4, 5], 2), и результат выглядит идентично исходному коду в этом вопросе.

...