lazy-evaluation - 意外的非懒惰
问题描述
我为这周的挑战编写了这段代码,以产生丑陋的数字。
sub factors( $n ) {
if $n > 1 {
$_, |factors $n div $_
given ( grep $n %% *, 2..* ).first } }
.say for ( 1, |grep *.&factors.all ∈ ( 2, 3, 5 ), 2..* )[^150];
这有效,从某种意义上说,它产生了正确的输出,但它的行为并不懒惰:输出不会立即开始,而是在开始后 30 秒开始。
但是,当我删除索引并遍历裸序列时
.say for 1, |grep *.&factors.all ∈ ( 2, 3, 5 ), 2..*;
我按预期立即得到输出。
这是一个错误,是吗?
解决方案
这不是一个错误(尽管可能会更好地记录下来)。索引与[]
具体化它索引的元素,因此[^150]
计算前 150 个元素的(非惰性)列表。(列表的其余部分仍然是惰性的,但那些初始元素不会)。
如果你想懒惰地迭代,你可以使用&head
它,它会给你以下最后一行:
.say for ( 1, |grep *.&factors.all ∈ ( 2, 3, 5 ), 2..* ).head(150);
推荐阅读
- python - 基于树莓派声音的红绿灯
- django - 如何使用 createAPI View 在 django rest 框架中保存 MultipointField
- c - 为什么我的函数的输出中会出现问号,我该如何避免它?
- java - Java - 模拟登录控制台 - 在询问密码之前验证用户名
- r - 修改顶部ggplot百分比条形图上的文本标签
- kotlin - Kotlin 如何通过消除检查异常来实现类型安全?
- firebase - 从 Flutter Web 发送邮件
- ios - 在 iOS PWA 上无法关闭“打开方式...”屏幕
- javascript - 如何在 JavaScript 中读取和处理 Excel 电子表格?
- android - 在 Styled Media Receiver Google Cast 上显示带有通信消息的字幕