отличить строку от списка в Erlang - PullRequest
9 голосов
/ 07 ноября 2011

В Erlang, когда у вас есть список печатных символов, это строка, но строка также является списком элементов, и все функции списка могут быть применены к строке. В идеале структура данных: строка не существует на эрланге.

Часть моего кода должна быть уверена, что что-то не только список, но и строка. (Настоящая строка). Нужно разделить списки, например [1,2,3,a,b,"josh"] из строки, например "Muzaaya" . Защитное выражение is_list/1 скажет true как для строк, так и для списков. Нет такого охранника, как is_string/1, и поэтому это означает, что мне нужен фрагмент кода, чтобы убедиться, что мои данные являются строкой. Строка в этом случае представляет собой список только для печати (в алфавитном порядке, оба случая, верхний и нижний) и может содержать числа, например, "Muzaaya2536 618 Joshua". мне нужен фрагмент кода (Erlang), который проверит меня и убедится, что переменная является строкой, а не просто списком. спасибо

Ответы [ 2 ]

24 голосов
/ 07 ноября 2011

В модуле io_lib есть две функции, которые могут быть полезны: io_lib:printable_list/1 и io_lib:printable_unicode_list/1, которые проверяют, является ли аргумент списком для печати латинский1 или Юникод символов соответственно.

6 голосов
/ 07 ноября 2011

с использованием определения печатаемых символов isprint (3) -

isprint(X) when X >= 32, X < 127 -> true;
isprint(_) -> false.

is_string(List) when is_list(List) -> lists:all(fun isprint/1, List);
is_string(_) -> false.

вы не сможете использовать его как охрану.

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