Я пишу программу, которая может иметь или список или строку как аргумент. Как я могу сказать различие между строкой и списком программно в Erlang. Что-то как:
print(List) -> list;
print(String) -> string.
io_lib: printable_list может быть тем, что вы ищете. Однако он не обрабатывает только Unicode-кодировки latin-1. Если вам нужно обнаружить строки Unicode, я думаю, вам может не повезти. Лучше всего использовать псевдотипирование ваших списков следующим образом: {string, [$ a, $ b, $ c]}. Этакая сборка твоих типов.
используйте такой конструктор, как строка (L), когда is_list (L) -> {строка, L}.
и просто используйте эту конструкцию ввода во всем приложении.
С другой стороны, вы можете просто рассматривать все строки как просто списки и не делать различий.
Зачем вам нужно их разделять? Строки - это списки на erlang (в большинстве случаев).
Лучшее, что вы можете сделать, это пометить ваши структуры, как предложил Джереми Уолл . В любом случае вы можете решить проверить вход в ваш модуль/подсистему/приложение/...
is_string([]) -> true;
is_string([X|T]) -> is_integer(X) andalso X>=0 andalso is_string(T);
is_string(_) -> false.
К сожалению, это дорогая операция, и вы не можете использовать ее в охранниках.