Elixir: (FunctionClauseError) no function clause matching

24,409

Solution 1

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

Solution 2

You did not handle the case when m > n, but you are still calling it. You either dont call it, or have a function definition that handles this case.

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

  defp _to(n, m), do: IO.puts "Completed Counting" end
Share:
24,409
Kevin Falting
Author by

Kevin Falting

Software developer at 1Password.

Updated on July 11, 2022

Comments

  • Kevin Falting
    Kevin Falting almost 2 years

    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.