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

发布于 2024-08-25 10:14:11 字数 144 浏览 3 评论 0原文

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

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

I am writing a program that can have either a list or a string as an argument. How can I tell the difference between a string and a list programmatically in Erlang. Something like:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

终陌 2024-09-01 10:14:11

io_lib:printable_list 可能就是您正在寻找的内容。但是它不处理仅 unicode latin-1 编码。如果您需要检测 unicode 字符串,我认为您可能不走运。最好的选择是伪输入列表,如下所示:{string, [$a, $b, $c]}。有点像构建你的类型。

使用像这样的构造函数 string(L) when is_list(L) -> {字符串,L}。只需在您的应用程序中使用该打字结构即可。

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

io_lib:printable_list might be what you are looking for. However it doesn't handle unicode only latin-1 encodings. If you need to detect unicode strings I think you might be out of luck. The best bet is pseudo typing your lists like so: {string, [$a, $b, $c]}. Kind of a build your types.

Use a constructor like so string(L) when is_list(L) -> {string, L}. and just use that typing construct all through your app.

On the other hand you could just treat all strings as just lists and not make the distinction.

梦里°也失望 2024-09-01 10:14:11

您能做的最好的事情是将您的结构标记为 Jeremy Wall 建议。无论如何,您可以决定检查模块/子系统/应用程序/的输入...

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

不幸的是,这是昂贵的操作,并且您不能在警卫中使用它。

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.

酒绊 2024-09-01 10:14:11

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模块文档是否有其他类似函数。

Erlang implements different functions to test if a list is a flat list in module io_lib. Despite Jeremy Wall comment there is a function to test if a flat list contains unicode characters as well as latin1 version.

If you want to test for flat unicode lists you can use
io_lib:char_list(Term)
http://erlang.org/doc/man/io_lib.html#char_list-1

io_lib:char_list/1 function implementation is:

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.

One good choice for checking latin1 encoded strings is 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.

Check the io_lib module documentation for other similar functions.

时光无声 2024-09-01 10:14:11

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

Why would you need to separate these? Strings are lists in erlang (most of the time).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文