为什么lists:flatten/2在Erlang脚本上不能正常工作?

nwlls2ji  于 2022-12-08  发布在  Erlang
关注(0)|答案(1)|浏览(141)

我尝试在Erlang中实现一个split方法,该方法应该将一个字符串(如"i am on the mountain top")拆分为一个列表(如["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>

我该如何解决这个问题?

uyhoqukh

uyhoqukh1#

两件事:
1.最后一行中的[WordSummer|Head]创建了一个不正确的列表,因为Head是一个整数(输入字符串的一个字符)。这就是您看到的错误。您可能是指[WordSummer, Head]

  1. [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)。

相关问题