使用 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_list
、String.codepoints
或 String.graphemes
以将其转换为列表。要使用的确切功能取决于您要执行的操作。
我的代码如下,我不清楚编译器为什么会报错:
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_list
、String.codepoints
或 String.graphemes
以将其转换为列表。要使用的确切功能取决于您要执行的操作。