def convert_to_ascii_art(list) do
[head | tail] = list
|> Enum.map(&ascii_char/1)
|> Enum.map(&String.split(&1, "\n"))
tail
|> Enum.reduce(head, &join_char/2)
|> Enum.join("\n")
endIn order to use Enum.reduce/3 we have to provide accumulator - an initial element for reducing. That is why we destruct list by its head, which would be accumulator, and its tail, which we provide as first argument to Enum.reduce/3.
It turns out, in Elixir we have overload for Enum.reduce, which is Enum.reduce/2. This version doesn't require an initial element, so we can rewrite our code, continuing pipe throughout the whole function.
def convert_to_ascii_art(list) do
list
|> Enum.map(&ascii_char/1)
|> Enum.map(&String.split(&1, "\n"))
|> Enum.reduce(&join_char/2)
|> Enum.join("\n")
end