隐式惰性收集/获取不视为“惰性”对象

时间:2019-04-15 11:42:25

标签: lazy-evaluation perl6

documentation for gather/take mentions

  

绑定到标量容器或无符号容器也将导致懒惰。

但是

my \result = gather { for 1..3 { take $_² } };
say result.is-lazy # OUTPUT: «False␤»  

如果您使用标量,并使用:=进行绑定,是否会发生某些隐式惰性收集/获取语句的方法?

更新:它实际上是惰性的,只是它没有以预期的方式响应is-lazy方法:

my $result := gather { for 1..3 { say "Hey"; take $_² } };
say $result[0] # OUTPUT: «Hey␤1␤»

所以问题是““懒惰者考虑实际懒惰的条件是什么?”

1 个答案:

答案 0 :(得分:9)

我认为问题实际上是您无法真正知道gather块中发生了什么。所以这就是Seq对象告诉您它不是惰性的原因。

也许更多的是文档问题:如果is-lazy返回True,那么您可以确保 Seq(实际上,其基础Iterator)本身不会结束。如果is-lazy返回False,则基本上意味着我们不确定。

有人可能会争辩说,在那种情况下,is-lazy应该返回Bool类型的对象,该对象也将被解释为false(因为所有类型对象在布尔中都被认为是False上下文)。但这至少可以表明它确实是不确定的/不确定的。