raku - 为什么 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)
为什么行不通的方式……行不通?
解决方案
简短的回答:
这可能是一个错误。
长答案:
(1, 2 ... *)
产生一个惰性序列,因为它显然是无限的,但不知何故,这并没有使结果序列被标记为惰性。
将一个序列放入一个数组@s
会导致它被急切地求值,除非它被标记为惰性。
快速解决:
附加lazy
到前面。
> my @s = [\+] lazy 0, |(1, 2 ... *)
[...]
> @s[^10]
(0 1 3 6 10 15 21 28 36 45)
推荐阅读
- javascript - React Hooks:useState with onClick 仅更新第二次单击按钮?
- angular - mod_rewrite 和 mod_proxy 在 Apache 配置中一起使用
- express - 引导断点不适用于 ejs
- java - 读取 csv 但发生 java.io.FileNotFoundException: (没有这样的文件或目录)
- c# - 如何在xml文件中保存属性值?
- spring-boot - 使用 Spring-data 在 cassandra 中进行分页
- jenkins - 无法使用詹金斯运行量角器
- python-3.x - 向上和向下箭头在 tkinter.Entry 小部件中插入不需要的字符
- ag-grid - 如何按行在 Ag-grid 中添加特定组件(如输入组件),或者如何在 Ag-grid 中按行删除组件?
- r - 需要一个包含相交值计数的矩阵