使用Enum.reduce,为什么编译器"错误未定义函数my_func / 0"

时间:2016-04-27 18:27:12

标签: elixir reducers

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

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

1 个答案:

答案 0 :(得分:3)

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

应该是

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

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

编辑:同样,字符串不可枚举。您应该首先将字符串传递给String.to_char_listString.codepointsString.graphemes,然后将其转换为列表。使用的确切功能取决于您要做的事情。