我正在编写一个程序,该程序可以具有列表或字符串作为参数。我如何在Erlang中以编程方式说明字符串和列表之间的区别。喜欢的东西:确定项目是Erlang中的字符串还是列表
print(List) -> list;
print(String) -> string.
我正在编写一个程序,该程序可以具有列表或字符串作为参数。我如何在Erlang中以编程方式说明字符串和列表之间的区别。喜欢的东西:确定项目是Erlang中的字符串还是列表
print(List) -> list;
print(String) -> string.
io_lib:printable_list可能是你在找什么。但是它不处理unicode只有拉丁-1编码。如果你需要检测unicode字符串,我认为你可能会运气不好。最好的办法是伪造你的列表,如下所示:{string,[$ a,$ b,$ c]}。一种建立你的类型。
当is_list(L) - > {string,L}时,使用像string(L)这样的构造函数。
而只是使用该键入构建全部通过您的应用程序。
另一方面,你可以将所有的字符串视为列表而不是区分。
你可以做的最好的事情是标记你的结构为Jeremy Wallsuggested。反正你可以决定检查输入到你的模块/子系统/应用/ ...
is_string([]) -> true;
is_string([X|T]) -> is_integer(X) andalso X>=0 andalso is_string(T);
is_string(_) -> false.
不幸的是昂贵的操作,你不能在后卫使用。
但是在你的例子中列表会显示为一个字符串,这是否正确? – Zubair 2010-03-19 21:40:25
我不明白问题。你的意思是像'new_string(X) - > true = is_string(X),{string,X} .''吗?所以答案是肯定的。 – 2010-03-19 22:50:51
为什么你需要分开这些?字符串是erlang中的列表(大部分时间)。
您需要这样做的最常见原因是树中的嵌套列表,其中一些子列表是需要被视为列表条目而不是子树的字符串。没有标记列表操作,如扁平化和树遍历变得更加困难。 – 2010-03-24 15:42:15
没错,在这种情况下,我使用伪打字来解决您的解决方案,因为这是构建您自己的控制流程的一种方式。 – Weasel 2010-03-25 18:32:58
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 function implementation is :
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模块文档以获取其他类似功能。
即使你的回答是完全正确的,你不需要冷静地回答我的答案。当我回答时,这是完全正确的。查找日期,并在Erlang/OTP分发中将Unicode支持添加到'io_lib'时。 – 2017-04-09 09:13:51
谢谢。是的,我确实想到了这种伪打字,但我不知道这是否是在Erlang做事的好方法。 – Zubair 2010-03-19 20:16:17
我见过的另一个选项是将所有字符串保存为二进制文件。 – 2010-03-24 15:41:18