确定项目是否是Erlang中的字符串或列表

时间:2010-03-19 18:32:36

标签: erlang

我正在编写一个程序,可以使用列表或字符串作为参数。如何在Erlang中以编程方式区分字符串和列表。类似的东西:

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

4 个答案:

答案 0 :(得分:6)

io_lib:printable_list可能就是你要找的东西。但是它不处理unicode只有latin-1编码。如果你需要检测unicode字符串,我想你可能会运气不好。最好的选择是伪输入你的列表,如:{string,[$ a,$ b,$ c]}。建立你的类型。

当is_list(L) - >时,使用类似字符串(L)的构造函数。 {string,L}。

只需在您的应用中使用该输入构建。

另一方面,您可以将所有字符串视为仅列表,而不是区分。

答案 1 :(得分:3)

最好的办法是将结构标记为Jeremy Wall suggested。无论如何,您可以决定对模块/子系统/应用程序/...

的检查输入
is_string([]) -> true;
is_string([X|T]) -> is_integer(X) andalso X>=0 andalso is_string(T);
is_string(_) -> false.

不幸的是,这是一项昂贵的操作,你不能在守卫中使用它。

答案 2 :(得分:3)

Erlang实现了不同的函数来测试列表是否是模块io_lib中的平面列表。尽管Jeremy Wall评论了一个函数来测试一个平面列表是否包含unicode字符以及latin1版本。

如果要测试平面unicode列表,可以使用 io_lib:char_list(期限) 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.

检查latin1编码字符串的一个不错的选择是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 :(得分:0)

为什么需要分开这些?字符串是erlang中的列表(大多数时候)。