首页 > 解决方案 > 为什么 Perl 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)

为什么行不通的方式……行不通?

标签: raku

解决方案


简短的回答:

这可能是一个错误。


长答案:

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

将一个序列放入一个数组@s会导致它被急切地求值,除非它被标记为惰性。


快速解决:

附加lazy到前面。

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

推荐阅读