почему списки: flatten / 2 не работает нормально на скрипте erlang - PullRequest
0 голосов
/ 27 августа 2018

здесь я пытаюсь реализовать метод разделения в эрланге, который должен разбивать строку вроде «я на вершине горы» в список типа [«i», «am», «on», "в" и "гора", "сверху"].

вот мой код (exerc.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 голосов
/ 27 августа 2018

Две вещи:

  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 в первом пункте функции).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...