Search code examples
functionoverloadingclauseelixirarity

Elixir: function overloading with different arity


is there any way to define overload functions with different arity, e.g in C# I can just do:

foo(bar)

or

foo(bar, baz)

In Elixir, the only way to do that would be to put them in separate modules, which will get messy pretty quickly. Is there any way around it?

Edit: I had made a wrong assumption. The examples of overloaded functions I saw happened to have the same arity, so I (wrongly) assumed that this was a requirement. Functions are uniquely identified by their name and arity, so you can in fact overload functions with different arity.


Solution

  • In Erlang and Elixir, and unlike many other languages (such as C#), functions are uniquely identified by their name and arity, so technically foo(bar) and foo(bar, baz) are totally different functions. But that's really just a technicality, to write an 'overloaded' function in Elixir, you would write something like the following definition of sum:

    defmodule Math do
      def sum(list),       do: sum(list, 0)
      def sum([], acc),    do: acc
      def sum([h|t], acc), do: sum(t, acc + h)
    end