Я новичок в Elixir, и я изучаю и читаю кое-что об использовании списков / перечислений и функциях.
Я научился комбинировать Enum.map
и Enum.each
, например, манипулировать контентом.списка и распечатки списка результатов на консоли через
people = ["Qui", "Quo", "Qua"]
people
|> Enum.map(&String.upcase/1)
|> Enum.map(&Hello.hello/1)
|> Enum.each(&IO.puts/1)
Мне интересно, существует ли библиотечная функция, которая объединяет Enum.map
и Enum.each
вместе: моя идея состоит в том, чтобы что-то сделалдля каждого элемента списка И возвращает нетронутый список , чтобы продолжить вызовы функции конвейерной передачи.Конечно, я могу добавить побочные эффекты к функции, переданной в Enum.map
, но мне не очень нравится этот подход, и я бы хотел, чтобы побочные эффекты были явно отделены от функциональных преобразований.
Я читаю документацию Enum
и List
, но не могу понять, как это сделать: Enum.each
возвращает :ok
, и я не могу найти что-то подобное, возвращающее исходный список.
Поэтому я сам реализовал это следующим образом:
defmodule MyEnum do
def tee list, action do
Enum.map(list, fn item ->
action.(item)
item
end)
end
end
( отказ от ответственности : конечно, я добавил побочные эффекты к map
, но я выделил эту грязность в функцию, имя которой должно прояснить мои намерения ) и переписать предыдущий пример как
people = ["Qui", "Quo", "Qua"]
people
|> Enum.map(&String.upcase/1)
|> Enum.map(&Hello.hello/1)
|> MyEnum.tee(&IO.puts/1)
|> Enum.map(&String.upcase/1)
|> Enum.each(&IO.puts/1)
Я работаю (и для меня было очень полезно написать этот код), но яМне интересно
- , есть ли что-то встроенное в стандартную библиотеку
- , если мое решение ручной работы - хорошее и идиоматическое решение в Elixir
Заранее спасибо!