В Erlang, когда у вас есть список печатных символов, его строка, но строка также представляет собой список элементов, и все функции списка могут быть применены к строке. В идеальном случае структура данных: строка не существует в erlang.
Часть моего кода должна быть уверена, что что-то является не только списком, но и его строкой. (Действительная строка). Он должен отделять списки, например. [1,2,3,a,b,"josh"]
, из строки, например. "Muzaaya"
. Защитное выражение is_list/1
скажет true
как для строк, так и для списков. Нет такой защиты, как , и поэтому это означает, что мне нужен фрагмент кода, чтобы мои данные были строкой. Строка в этом случае представляет собой список только для печати (в алфавитном порядке, оба случая, верхний и нижний) и может содержать числа, например is_string/1
"Muzaaya2536 618 Joshua"
. Мне нужен фрагмент кода (Erlang), который проверяет меня и гарантирует, что переменная является строкой, а не только списком. спасибо
Различать строку из списка в Erlang
Ответ 1
У вас есть две функции в модуле io_lib
, которые могут быть полезны: io_lib:printable_list/1
и io_lib:printable_unicode_list/1
, которые проверяют, соответствует ли аргумент символам latin1 или unicode.
Ответ 2
используя определение printprint (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.
вы не сможете использовать его как охранника.