In elixir you can provide default params like so: defmodule Say do def hello(subject \\ "world") do IO.puts "Hello #{subject}" end end Say.hello Say.hello("mars") And everything works just fine and dandy: $ elixir say.exs Hello world Hello mars Ok cool! So lets do some recursion...because elixir! defmodule Say do def hellos([subject|subjects]) do IO.puts "Hello #{subject}" hellos(subjects) end def hellos([]) do IO.puts "Done saying hello!" end def hello(subject \\ "world") do IO.puts "Hello #{subject}" end end Say.hellos(['world', 'mars']) $ elixir say.exs Hello world Hello mars Done saying hello! Now lets try to add some defaults: defmodule Say do def hellos([subject|subjects] \\ ["World", "Moon", "Sun"]) do IO.puts "Hello #{subject}" hellos(subjects) end def hellos([]) do IO.puts "Done saying hello!" end def hello(subject \\ "world") do IO.puts "Hello #{subject}" end end Say.hellos(['world', 'mars']) And we hit a compile error: $ elixir say.exs ** (CompileError) say.exs:8: def hellos/1 has default values and multiple clauses, define a function head with the defaults (elixir) src/elixir_def.erl:328: :elixir_def.store_each/7 (elixir) src/elixir_def.erl:91: :elixir_def.store_definition/9 say.exs:8: (module) say.exs:1: (file) All we need to do to fix this is define a bodyless function with the defaults provided there (see line 2): defmodule Say do def hellos(subjects \\ ["World", "Moon", "Sun"]) def hellos([subject|subjects]) do IO.puts "Hello #{subject}" hellos(subjects) end def hellos([]) do IO.puts "Done saying hello!" end def hello(subject \\ "world") do IO.puts "Hello #{subject}" end end Say.hellos Say.hellos(['world', 'mars']) $ elixir say.exs Hello World Hello Moon Hello Sun Done saying hello! Hello world Hello mars Done saying hello! And all is right with the world again.