【问题标题】:Why does lists:flatten/2 does not work fine on Erlang script?为什么 lists:flatten/2 在 Erlang 脚本上不能正常工作?
【发布时间】:2019-02-01 22:46:11
【问题描述】:

我正在尝试在 Erlang 中实现拆分方法,该方法应该将"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>

我该如何解决这个问题?

【问题讨论】:

    标签: erlang


    【解决方案1】:

    两件事:

    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)。

    【讨论】:

    • 非常感谢,我知道我仍然需要修改基础知识
    • 请提供我可以这样做的甜蜜链接
    猜你喜欢
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 2023-02-20
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    • 1970-01-01
    • 2014-12-02
    相关资源
    最近更新 更多