Объединение Enum.map и Enum.each - PullRequest
0 голосов
/ 01 марта 2019

Я новичок в 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)

Я работаю (и для меня было очень полезно написать этот код), но яМне интересно

  1. , есть ли что-то встроенное в стандартную библиотеку
  2. , если мое решение ручной работы - хорошее и идиоматическое решение в Elixir

Заранее спасибо!

1 Ответ

0 голосов
/ 01 марта 2019

Stream.each будет делать то, что вы хотите, но вам нужно будет использовать поток для запуска эффектов.

Выполняет данную функцию для каждого элемента.

Полезно для добавления побочных эффектов (например, печати) в поток.

people 
|> Enum.map(&String.upcase/1) 
|> Stream.each(&IO.inspect/1) 
|> Enum.to_list
...