假设我使用REPL上的三角形缩小定义了一个惰性无限数组,并在前面粘贴了一个元素:
> my @s = 0, |[\+] (1, 2 ... *)
[...]
Run Code Online (Sandbox Code Playgroud)
我可以打印出前几个元素:
> @s[^10]
(0 1 3 6 10 15 21 28 36 45)
Run Code Online (Sandbox Code Playgroud)
我想将减少内部的零元素移动到这样:
> my @s = [\+] (0, |(1, 2 ... *))
Run Code Online (Sandbox Code Playgroud)
然而,作为对此的回应,REPL挂起,大概是通过尝试评估无限列表.
如果我在单独的步骤中执行它,它的工作原理:
> my @s = 0, |(1, 2 ... *)
[...]
> ([\+] @s)[^10]
(0 1 3 6 10 15 21 28 36 45)
Run Code Online (Sandbox Code Playgroud)
为什么不这样做不起作用......工作?
简短回答:
这可能是一个错误.
答案很长:
(1, 2 ... *) 产生一个懒惰的序列,因为它显然是无限的,但不知何故,这并没有使得结果序列被标记为懒惰.
将序列放入数组@s会导致它被急切地评估,除非它被标记为惰性.
快速解决:
贴lazy在前面.
> my @s = [\+] lazy 0, |(1, 2 ... *)
[...]
> @s[^10]
(0 1 3 6 10 15 21 28 36 45)
Run Code Online (Sandbox Code Playgroud)