在这里,我尝试在erlang中实现split方法,该方法应该将诸如“我在山顶上”这样的字符串拆分为类似[“ i”,“ am”,“ on”的列表, “ the”,“ mountain”,“ top”]。
这是我的代码(exercise.erl):
-module(exercise).
-import(oi,[read/1]).
-export([split/4]).
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]).
我遇到的问题是,当调用导出的函数时,出现以下错误
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>
我需要帮助来解决我的问题。 谢谢你。
答案 0 :(得分:0)
两件事:
最后一行中的[WordSummer|Head]
正在创建不正确的列表,因为Head
是整数(输入字符串的一个字符)。这导致您看到的错误。您可能是说[WordSummer, Head]
。
[Result|lists:flatten(WordSummer)]
正在创建嵌套列表,而不是字符串列表。要将一项附加到列表中,请使用++
并将右侧包裹在列表中:Result ++ [lists:flatten(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"]
仍然有一个错误,其中最后一段被忽略。我会让你弄清楚(提示:您需要在函数的第一子句中考虑WordSummer
)。