Определение, является ли элемент строкой или списком в Erlang - PullRequest
5 голосов
/ 19 марта 2010

Я пишу программу, которая может иметь список или строку в качестве аргумента.Как можно программно определить разницу между строкой и списком в Erlang.Что-то вроде:

print(List) -> list; 
print(String) -> string.

Ответы [ 4 ]

6 голосов
/ 19 марта 2010

io_lib: printable_list может быть тем, что вы ищете. Однако он не обрабатывает только кодировку Unicode в латинском коде. Если вам нужно обнаружить строки Unicode, я думаю, вам не повезло. Лучше всего псевдопечатать ваши списки так: {string, [$ a, $ b, $ c]}. Вид билда твоего типа.

использовать конструктор наподобие string (L), когда is_list (L) -> {string, L}.

и просто используйте эту конструкцию ввода во всем приложении.

С другой стороны, вы можете просто рассматривать все строки как списки и не делать различий.

3 голосов
/ 08 апреля 2017

Erlang реализует различные функции для проверки, является ли список плоским списком в модуле io_lib. Несмотря на комментарий Джереми Уолла, есть функция для проверки, содержит ли плоский список символы Юникода, а также версию latin1.

Если вы хотите проверить плоские списки Юникода, вы можете использовать io_lib: char_list (Term) http://erlang.org/doc/man/io_lib.html#char_list-1

io_lib: char_list / 1 реализация функции:

char_list([C|Cs]) when is_integer(C), C >= 0, C < 16#D800;
       is_integer(C), C > 16#DFFF, C < 16#FFFE;
       is_integer(C), C > 16#FFFF, C =< 16#10FFFF ->
    char_list(Cs);
char_list([]) -> true;
char_list(_) -> false.

Один хороший выбор для проверки строк, закодированных в латинице 1: io_lib: latin1_char_list (Term) http://erlang.org/doc/man/io_lib.html#latin1_char_list-1

io_lib: latin1_char_list / 1 Реализация функции:

latin1_char_list([C|Cs]) when is_integer(C), C >= $\000, C =< $\377 ->
      latin1_char_list(Cs);
latin1_char_list([]) -> true;
latin1_char_list(_) -> false.

Проверьте документацию модуля io_lib для других подобных функций.

3 голосов
/ 19 марта 2010

Лучшее, что вы можете сделать, это пометить ваши структуры как Джереми Уолл предложил . В любом случае вы можете решить проверить входные данные для вашего модуля / подсистемы / приложения /...

is_string([]) -> true;
is_string([X|T]) -> is_integer(X) andalso X>=0 andalso is_string(T);
is_string(_) -> false.

К сожалению, это дорогостоящая операция, и вы не можете использовать ее в охране.

0 голосов
/ 23 марта 2010

Зачем вам их разделять? Строки - это списки в эрланге (большую часть времени).

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