【问题标题】:confusion with the erlang clauses与 erlang 条款混淆
【发布时间】:2014-09-05 20:51:03
【问题描述】:

我对 erlang 非常陌生,我只是从一本书中学习(programming erlang)。我对这些用作 for 循环的行有一些疑问:

lib_misc.erl:

for(Max, Max, F) -> [F(Max)];
for(I, Max, F) -> [F(I)|for(I+1, Max, F)].

然后这样做:

1> lib_misc:for(1,10,fun(I) -> I end).
[1,2,3,4,5,6,7,8,9,10]

有人可以向我解释这里发生了什么吗?

【问题讨论】:

    标签: erlang


    【解决方案1】:

    第一个子句for(Max, Max, F) 对前两个参数使用相同的变量名。因此,该子句仅在前两个参数相等时才匹配。也可以这样写:

    for(I, Max, F) when I =:= Max -> ...
    

    第二个子句调用提供的函数F,然后在计数器增加的情况下对自身进行递归调用。最终,此调用将到达第一个子句,“循环”终止。

    (但是,如果I 开始大于Max,则此函数将永远不会终止,例如for(2, 1, fun integer_to_list/1)。)

    【讨论】:

    • 保证它安全的最简单方法是在第二个子句for(I, Max, F) when I < Max -> ... 中添加一个guard,它将排除I 开始大于Max 并生成一个错误。
    猜你喜欢
    • 2013-04-28
    • 2014-07-09
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多