我的代码如下,我不清楚为什么编译器会抱怨:
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
答案 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_list
,String.codepoints
或String.graphemes
,然后将其转换为列表。使用的确切功能取决于您要做的事情。