为什么列表:展平/2在Erlang脚本上不能正常工作?
我正在尝试在Erlang中实现一个split方法,该方法应该将一个字符串(如为什么列表:展平/2在Erlang脚本上不能正常工作?,erlang,Erlang,我正在尝试在Erlang中实现一个split方法,该方法应该将一个字符串(如“我在山顶上”)拆分为一个列表(如[“我”、“在”、“在”、“山”、“在山顶上”]) 这是我的代码(exercise.erl): 我遇到的问题是,在调用导出函数时,出现以下错误: 9> c(exercise). {ok,exercise} 10> exercise:split("sdffdgfdg dgdfgfg dgdfg dgdfgd dfgdfgdfgtrty hghfgh",$ ,
“我在山顶上”
)拆分为一个列表(如[“我”、“在”、“在”、“山”、“在山顶上”]
)
这是我的代码(exercise.erl):
我遇到的问题是,在调用导出函数时,出现以下错误:
9> c(exercise).
{ok,exercise}
10> exercise:split("sdffdgfdg dgdfgfg dgdfg dgdfgd dfgdfgdfgtrty hghfgh",$ ,[],[]).
** exception error: no function clause matching lists:do_flatten(103,[]) (lists.erl, line 627)
in function lists:do_flatten/2 (lists.erl, line 628)
in call from exercise:split/4 (exercise.erl, line 9)
11>
我如何解决这个问题?有两件事:
[WordSummer | Head]
创建了一个不正确的列表,因为Head
是一个整数(输入字符串的一个字符)。这导致了您看到的错误。你的意思可能是[WordSummer,Head]
[Result | lists:flant(WordSummer)]
正在创建嵌套列表而不是字符串列表。要将一项附加到列表中,请使用++
并将右侧包装到列表中:Result++[列表:展平(WordSummer)]
split(Text,_,Result,_) when Text == [] -> Result;
split([Head|Tail],Separator,Result,WordSummer) when Head == Separator ->
split(Tail,Separator,Result ++ [lists:flatten(WordSummer)],[]);
split([Head|Tail],Separator,Result,WordSummer) ->
split(Tail,Separator,Result,[WordSummer, Head]).
测试:
仍然有一个错误,最后一段被忽略。我会让你知道这一点(提示:你需要在函数的第一个子句中考虑<代码> WordSummer <代码>)。
split(Text,_,Result,_) when Text == [] -> Result;
split([Head|Tail],Separator,Result,WordSummer) when Head == Separator ->
split(Tail,Separator,Result ++ [lists:flatten(WordSummer)],[]);
split([Head|Tail],Separator,Result,WordSummer) ->
split(Tail,Separator,Result,[WordSummer, Head]).
1> c(exercise).
{ok,exercise}
2> exercise:split("sdffdgfdg dgdfgfg dgdfg dgdfgd dfgdfgdfgtrty hghfgh",$ ,[],[]).
["sdffdgfdg","dgdfgfg","dgdfg","dgdfgd","dfgdfgdfgtrty"]