【问题标题】:Erlang print 2 listErlang 打印 2 列表
【发布时间】:2011-06-15 08:29:43
【问题描述】:

我有 2 个列表:

 List1 = [1,2,3].
 List2 = ["asd", "sda", "dsa"].

如何依次打印此列表:

1 个 2个sda 3天

谢谢。

【问题讨论】:

  • 提及这种打印的原因不会有什么坏处。
  • 对此有一个有趣的参数交换解决方案:[io:format("~p", [X]) || X <- merge(List1, List2)] where merge([], L) -> L; merge([H|T1], L2) -> [H | merge(L2, T1)].(未测试)。

标签: list functional-programming erlang


【解决方案1】:
1> lists:zipwith(fun (X1, X2) -> io:format("~p ~p ", [X1,X2]) end, List1, List2).
1 "asd" 2 "sda" 3 "dsa" [ok,ok,ok]
2> 

【讨论】:

    【解决方案2】:

    有时最好重新发明轮子。在 erlang 的情况下 - 只是为了了解递归、尾调用以及如何使用列表。

    f([], []) -> 
        ok;
    f([H1|R1], [H2|R2]) -> 
        io:format("~p ~p", [H1, H2]), 
        f(R1, R2).
    

    【讨论】:

    • @shk:由于两个列表中的元素数量相同,因此第一个子句的开头可以安全地写为f([], _),其中_ 是“无关紧要” " 变量,忽略值。
    • @Yasir Arsanukaev:这取决于上下文和预期的功能严格性。更严格的版本有时会发现一些错误。还有更仁慈的版本f([H1|R1], [H2|R2]) -> io:format("~p ~p", [H1, H2]), f(R1, R2); f(_, _) -> ok.
    • @Hynek:确实呵呵;完全忘记了这个功能。后一个子句用作“全部捕获”(如果我不混淆这些术语),并且将在所有其他情况下调用(列表为空或大小不同)。我们的功能是“防御性编程”。感谢您的通知。 :-)
    猜你喜欢
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    相关资源
    最近更新 更多