Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Elixir: (FunctionClauseError) no function clause matching

Tags:

elixir

I've made this elixir module that should print each number, "counting" up to the number you give it.

defmodule Count do
  def to(n) do
    m = 1
    _to(n, m)
  end
  defp _to(n, m) when (m <= n) do
    IO.puts "#{m}"
    x = m + 1
    _to(n, x)
  end
end

...but when I run it, it performs exactly as expected except that it throws this error at the end. What is happening here?

iex(1)> Count.to 5  
1
2
3
4
5
** (FunctionClauseError) no function clause matching in Count._to/2
count.exs:6: Count._to(5, 6)
iex(1)>

Thank you for any help.

like image 610
Kevin Falting Avatar asked Jul 17 '16 04:07

Kevin Falting


1 Answers

Elixir doesn't silently ignore a function call if none of the clauses match -- you get a FunctionClauseError. In this case, when m > n, no function clause in _to matches, so Elixir throws that error. You need to add another version of _to which accepts any m and n (or you could add a when m > n there, if you want) and does nothing.

defp _to(n, m) when (m <= n) do
  IO.puts "#{m}"
  x = m + 1
  _to(n, x)
end
defp _to(n, m) do
end
like image 77
Dogbert Avatar answered Sep 18 '22 09:09

Dogbert