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

vtwuwzda  于 2022-12-08  发布在  Erlang
关注(0)|答案(4)|浏览(151)

我正在写一个程序,它可以有一个列表或一个字符串作为参数。我如何在Erlang中通过编程区分字符串和列表。比如:

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

jjjwad0x1#

io_lib:printable_list可能是你要找的。但是它不能处理unicode的拉丁1编码。如果你需要检测unicode字符串,我想你可能运气不好。最好的办法是像这样伪输入你的列表:{string, [$a, $b, $c]}。类似于构建您的类型。
使用一个构造函数,比如string(L) when is_list(L) -> {string, L} .,并且在整个应用程序中使用该类型化构造。
另一方面,您可以将所有字符串都视为列表,而不进行区分。

1sbrub3j

1sbrub3j2#

Best thing what you can do is tagging your structures as Jeremy Wall suggested. Anyway you can decide check input to your module/subsystem/application/...

is_string([]) -> true;
is_string([X|T]) -> is_integer(X) andalso X>=0 andalso is_string(T);
is_string(_) -> false.

Unfortunately it is expensive operation and you can't use it in guards.

6ie5vjzr

6ie5vjzr3#

Erlang在io_lib模块中实现了不同的函数来测试一个列表是否是一个平面列表。尽管Jeremy Wall注解了一个函数来测试一个平面列表是否包含unicode字符以及latin 1版本。
如果您想测试单一Unicode列表,可以使用io_lib:char_list(Term)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.

检查latin 1编码字符串的一个好方法是io_lib:latin1_char_list(Term)http://erlang.org/doc/man/io_lib.html#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模块文档。

lf3rwulv

lf3rwulv4#

为什么要把它们分开呢?字符串是用Erlang编写的列表(大多数情况下)。

相关问题