代码之家  ›  专栏  ›  技术社区  ›  Sean

为什么Perl6只在两种类似情况中的一种情况下尝试评估无限列表?

  •  9
  • Sean  · 技术社区  · 6 年前

    假设我在repl处使用三角形缩减,在前面粘贴一个元素来定义一个懒惰的无限数组:

    > my @s = 0, |[\+] (1, 2 ... *)
    [...]
    

    我可以打印出前几个元素:

    > @s[^10]
    (0 1 3 6 10 15 21 28 36 45)
    

    我想把零元素移到约简里,就像这样:

    > my @s = [\+] (0, |(1, 2 ... *))
    

    然而,作为对此的响应,repl挂起,可能是通过尝试计算无限列表。

    如果我分步骤进行,它会工作:

    > my @s = 0, |(1, 2 ... *)
    [...]
    > ([\+] @s)[^10]
    (0 1 3 6 10 15 21 28 36 45)
    

    为什么这种方式不起作用……起作用?

    1 回复  |  直到 6 年前
        1
  •  7
  •   Brad Gilbert    6 年前

    简短回答:

    可能是个虫子。


    长答案:

    (1, 2 ... *) 生成一个懒惰序列,因为它显然是无限的,但不知何故,这并不能使结果序列被标记为懒惰。

    将序列放入数组 @s 使它被热切地评价,除非它被标记为懒惰。


    快速修复:

    追加 lazy 在前面。

    > my @s = [\+] lazy 0, |(1, 2 ... *)
    [...]
    > @s[^10]
    (0 1 3 6 10 15 21 28 36 45)
    
    推荐文章