Error: undefined function for a function in the same module (newbie level)

Hello, I just started learning Elixir this week. I’m puzzled by an error I’m getting.

Here’s a simple module:

defmodule Mylist2 do
  def reduce([], value, _func), do: value
  def reduce([head | tail], value, func), do: reduce(tail, func.(head, value), func)

  def max(a, b) when (a <= b), do: b
  def max(a, b) when (a > b), do: a

  def maxlist(list), do: reduce(list, -9999999, max)
end

When I compile the module I get this error:

** (CompileError) maxlist.exs:8: undefined function max/0 (expected Mylist2 to define such a function or for it to be imported, but none are available)

** (CompileError)  compile error
    (iex 1.13.4) lib/iex/helpers.ex:203: IEx.Helpers.c/2

It seems there’s something don’t know yet about how to reuse functions within a module … Someone can spot the problem?

The offending function seems to be the max function used in the reduce in the last line.

Many thanks!

2 Likes

Hello and welcome,

Functions arity are important, because max/0 is not max/1 nor max/2.

The compiler says it cannot find max/0 which is true. You have a max/2 defined…

BTW max/2 is already a function of the Kernel module → it’s going to conflict.

What You can do is this.

defmodule Mylist2 do
  def reduce([], value, _func), do: value
  def reduce([head | tail], value, func), do: reduce(tail, func.(head, value), func)

  def mymax(a, b) when (a <= b), do: b
  def mymax(a, b) when (a > b), do: a

  def maxlist(list), do: reduce(list, -9999999, &mymax/2)
end

This &mymax/2 special notation defines an anonymous function with 2 params…

It’s a shortcut for fn x, y → mymax(x, y) end

4 Likes

Oh, that was a quick reply, in a matter of a couple of a few minutes!

Many thanks, that works :slight_smile:

1 Like