使用 Enum.reduce,为什么那个编译器 "error undefined function my_func/0"

Using Enum.reduce, why that compiler "error undefined function my_func/0"

我的代码如下,我不清楚编译器为什么会报错:

rle.exs:3: warning: function reducer_fun/2 is unused
** (CompileError) rle.exs:15: undefined function reducer_fun/0
    (stdlib) lists.erl:1337: :lists.foreach/2
    (stdlib) erl_eval.erl:670: :erl_eval.do_apply/6

也就是说,假设 Enum.reduce 需要一个 arity 0 的 reducer 函数,这让我很困惑。

我的代码中是否有明显错误的地方?为什么它不使用定义的 reducer_fun ?

  defp reducer_fun(x,y) do y end

  @spec encode(String.t) :: String.t
  def encode(string) do
    cond do
      string == "" -> ""

      # the reduction is done here
      true -> Enum.concat(Enum.reduce(string, {:no_letter, 0, []}, reducer_fun))
    end

  end
true -> Enum.concat(Enum.reduce(string, {:no_letter, 0, []}, reducer_fun))

应该是

true -> Enum.concat(Enum.reduce(string, {:no_letter, 0, []}, &reducer_fun/2))

as Enum.reduce/3 期望 fn 和 arity 2 作为第三个参数,而您的原始代码试图在名为 reducer_fun 的同一模块中调用一个没有参数的函数(因此错误 undefined function reducer_fun/0) 并将返回值传递给 Enum.reduce/3.

编辑:此外,字符串不可枚举。您应该先将字符串传递给 String.to_char_listString.codepointsString.graphemes 以将其转换为列表。要使用的确切功能取决于您要执行的操作。