Различать строку из списка в Erlang

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

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

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