Erlang 中确定一个项目是字符串还是列表
我正在编写一个程序,可以将列表或字符串作为参数。我如何在 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
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.
您能做的最好的事情是将您的结构标记为 Jeremy Wall 建议。无论如何,您可以决定检查模块/子系统/应用程序/的输入...
不幸的是,这是昂贵的操作,并且您不能在警卫中使用它。
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/...
Unfortunately it is expensive operation and you can't use it in guards.
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 函数实现是:
检查 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函数实现是:
查看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:
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:
Check the io_lib module documentation for other similar functions.
为什么需要将它们分开?字符串是 erlang 中的列表(大多数时候)。
Why would you need to separate these? Strings are lists in erlang (most of the time).