【问题标题】:Determining if an item is a string or a list in Erlang在 Erlang 中确定项目是字符串还是列表
【发布时间】:2020-11-24 22:08:54
【问题描述】:

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

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

【问题讨论】:

    标签: erlang


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢。是的,我确实想到了这种伪类型,但我不知道这是否是在 Erlang 中做事的好方法。
    • 我见过的另一个选项是将所有字符串保留为二进制文件。
    【解决方案2】:

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

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

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

    【讨论】:

    • 但是在您的示例中,列表会显示为字符串,对吗?
    • 我不懂问题。你的意思是像new_string(X) -> true = is_string(X), {string, X}.这样的东西吗?所以答案是肯定的。
    【解决方案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 模块文档了解其他类似功能。

    【讨论】:

    • 即使您的答案完全正确,您也不必对我的答案投反对票。当我回答它时,它是完全正确的。查找将 Unicode 支持添加到 io_lib inErlang/OTP 分发的日期和时间。
    【解决方案4】:

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

    【讨论】:

    • 您需要这样做的最常见原因是树中的嵌套列表,其中一些子列表是字符串,需要将其视为列表条目而不是子树。不标记列表操作,如展平和树遍历变得更加困难。
    • 对,在这种情况下,我将使用伪类型来支持您的解决方案,因为它是构建您自己的控制流方式的一种方式。
    猜你喜欢
    • 1970-01-01
    • 2017-12-11
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多