假设我在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, 2 ... *) 生成一个懒惰序列,因为它显然是无限的,但不知何故,这并不能使结果序列被标记为懒惰。
(1, 2 ... *)
将序列放入数组 @s 使它被热切地评价,除非它被标记为懒惰。
@s
快速修复:
追加 lazy 在前面。
lazy
> my @s = [\+] lazy 0, |(1, 2 ... *) [...] > @s[^10] (0 1 3 6 10 15 21 28 36 45)