Перевернуть и составить список - PullRequest
2 голосов
/ 06 июня 2019

Какой самый идиоматичный способ объединения обратной версии списка с первоначальным списком? Итак:

Input:  [1, 2, 3], which is the output of my_func()
Output: [1, 2, 3, 3, 2, 1]

Этого можно достичь не очень идиоматическим образом, например:

n = my_func() # returns e.g. [1, 2, 3]
n_reversed = Enum.reverse(n)
n_combined = Enum.concat(n, n_reversed)

Я думал о чем-то вроде этого (не работает):

my_func() |> Enum.concat(Enum.reverse(&(&1)))

Это решение работает, но не выглядит для меня идиоматично:

n |> Enum.reverse() |> (fn enum -> Enum.concat(n, enum) end).()

Знаете ли вы идиоматический способ достижения этого?

Ответы [ 2 ]

4 голосов
/ 06 июня 2019

Я бы сказал, что было бы более логичным использовать оператор ++ вместо Enum.concat. (Обратите внимание, что ++ требует, чтобы аргументы были списками, в то время как Enum.concat принимает любые перечисляемые типы.)

n_combined = n ++ Enum.reverse(n)
2 голосов
/ 06 июня 2019

Если вы часто этим занимаетесь и пытаетесь избежать написания имени переменной дважды, чтобы поддерживать работу линии, вы можете заключить ее в функцию.

def reverse_concat(list), do: list ++ Enum.reverse(list)

Тогда что-то вроде

my_func() |> reverse_concat()

производит

[1, 2, 3, 3, 2, 1]
...