What prevents us from piping to arithmetic operators?

I believe it conflicts with the unary + operator, which has a higher precedence than |>.

x = quote do: 5 |> +(2)
# {:|>, [context: Elixir, import: Kernel],
# [5, {:+, [context: Elixir, import: Kernel], [2]}]}

x |> Macro.expand(__ENV__) |> Macro.to_string() |> Macro.format_string!()

# warning: piping into a unary operator is deprecated, please use the qualified name. For example, Kernel.+(5), instead of +5

# ** (ArgumentError) cannot pipe 5 into +2, the :+ operator can only take two arguments

That argument error, seems to have an error in its statement though. I suspect it was allowed at some point and became disallowed because of precedence/parsing issues.

4 Likes