【问题标题】:How can I use "map" inside a "for" loop in Perl 6?如何在 Perl 6 的“for”循环中使用“map”?
【发布时间】:2016-01-10 16:15:54
【问题描述】:

我正在尝试在for 循环中使用map,但此代码不起作用。此代码应打印 12 三次。但是下面的代码不会产生任何输出。如果您取消注释 exit 行,它只会部分工作。知道为什么吗?我使用当前的 Perl 6 版本(基于 MoarVM 版本 2015.12 和 Windows 版本构建的 Rakudo 版本 2015.12-79-g4bb47d5)对其进行了测试。

for (1..3) {
 map { say $_ }, (1..2);
# exit;
}

【问题讨论】:

    标签: raku


    【解决方案1】:

    我们来看看

    say (map { say $_ }, 1..2).WHAT;
    

    这告诉我们&map 返回一个Seq,这是一个惰性构造。

    此外,for 循环体中的最后一条语句用于聚合其返回值,cf

    my @list = do for 1..3 {
        map { say $_ }, 1..2;
    }
    
    say .WHAT for @list;
    

    如果您在调用 &map 之后添加另一个语句,则该调用将处于“接收器上下文”中并被急切地评估。

    这也可以显式强制:

    for 1..3 {
        sink map { say $_ }, 1..2;
    }
    

    或者,只需使用另一个 for 循环:

    for 1..3 {
        .say for 1..2;
    }
    

    【讨论】:

    • 你也可以通过使用eager而不是sink来强制它成为一个急切的序列。如果前面没有dodo for 1..3 { … }
    • 似乎这里的教训是:小心使用像 map 这样的过滤函数来产生副作用,就好像它是一个循环一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 2016-03-27
    相关资源
    最近更新 更多