Elixir's pipeline operator |>
apparently passes the result of each step as the first parameter to the next, so
iex> [1, [2], 3] |> List.flatten |> Enum.map(fn x -> x * 2 end)
[2, 4, 6]
is equivalent to
iex> Enum.map(List.flatten([1,[2],3]), fn x -> x * 2 end)
[2, 4, 6]
Which is function composition, but the partial application happens from the left (first parameter).
"Equivalent" in Haskell:
[[1,2],[2,3],[3,4]] |> flatten |> map (\x -> x * 2)
[2,4,4,6,6,8]
(scare quotes as we can't have a mixed list [1,[2],3]
as in the Elixir example)