为什么list:flatten / 2在erlang脚本上无法正常工作

时间:2018-08-27 11:44:03

标签: erlang

在这里,我尝试在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>

我需要帮助来解决我的问题。 谢谢你。

1 个答案:

答案 0 :(得分:0)

两件事:

  1. 最后一行中的[WordSummer|Head]正在创建不正确的列表,因为Head是整数(输入字符串的一个字符)。这导致您看到的错误。您可能是说[WordSummer, Head]

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