为什么列表:展平/2在Erlang脚本上不能正常工作?

为什么列表:展平/2在Erlang脚本上不能正常工作?,erlang,Erlang,我正在尝试在Erlang中实现一个split方法,该方法应该将一个字符串(如“我在山顶上”)拆分为一个列表(如[“我”、“在”、“在”、“山”、“在山顶上”]) 这是我的代码(exercise.erl): 我遇到的问题是,在调用导出函数时,出现以下错误: 9> c(exercise). {ok,exercise} 10> exercise:split("sdffdgfdg dgdfgfg dgdfg dgdfgd dfgdfgdfgtrty hghfgh",$ ,

我正在尝试在Erlang中实现一个split方法,该方法应该将一个字符串(如
“我在山顶上”
)拆分为一个列表(如
[“我”、“在”、“在”、“山”、“在山顶上”]

这是我的代码(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"]