perl6 – 为什么Perl 6只在两种类似的情况中尝试评估无限列表?
发布时间:2020-12-15 21:49:35 所属栏目:大数据 来源:网络整理
导读:假设我使用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) 我想在缩小中移动零元素,如下所示: > my @s = [+] (0,|(1,2 ... *)) 然而,作为对此的回应,REPL挂起,大概是通过尝试评估无限列表. 如果我在单独的步骤中执行它,它的工作原理: > my @s = 0,2 ... *) [...] > ([+] @s)[^10] (0 1 3 6 10 15 21 28 36 45) 为什么不这样做不起作用……工作? 解决方法
简短回答:
这可能是一个错误. 答案很长: (1,2 … *)产生一个懒惰的序列,因为它显然是无限的,但不知何故,这并没有使得结果序列被标记为惰性. 将序列放入数组@s会导致它被急切地评估,除非它被标记为惰性. 快速解决: 在前面添加懒惰. > my @s = [+] lazy 0,2 ... *) [...] > @s[^10] (0 1 3 6 10 15 21 28 36 45) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |