gpt4 book ai didi

perl - Perl 6 的这一侧是否有针对惰性列表的 Perl 解决方案?

转载 作者:行者123 更新时间:2023-12-04 01:17:18 26 4
gpt4 key购买 nike

有没有人为 Perl 中的惰性求值列表找到了一个好的解决方案?我尝试了很多方法来改变类似的东西

for my $item ( map { ... } @list ) { 
}

进入懒惰的评估——例如,通过绑定(bind)@list。我试图避免分解并编写源过滤器来执行此操作,因为它们会干扰您调试代码的能力。有没有人成功过。还是您只需要分解并使用while循环?

注:我想我应该提一下,有时我有点迷上了用于功能转换列表的长 grep-map 链。所以与其说是 foreach 循环或 while 循环。这是 map 表达式倾向于将更多功能打包到相同的垂直空间中。

最佳答案

如前所述,for(each) 是一个急切的循环,因此它希望在开始之前评估整个列表。

为简单起见,我建议使用迭代器对象或闭包,而不是尝试使用惰性求值的数组。虽然您可以使用 tie 来获得一个惰性求值的无限列表,但如果您曾经(直接或间接地,如上面的 foreach 中)询问整个列表(甚至整个列表的大小),您可能会遇到麻烦。

无需编写完整的类或使用任何模块,您只需使用闭包即可创建一个简单的迭代器工厂:

sub make_iterator {
my ($value, $max, $step) = @_;

return sub {
return if $value > $max; # Return undef when we overflow max.

my $current = $value;
$value += $step; # Increment value for next call.
return $current; # Return current iterator value.
};
}

然后使用它:
# All the even numbers between 0 -  100.
my $evens = make_iterator(0, 100, 2);

while (defined( my $x = $evens->() ) ) {
print "$x\n";
}

还有 Tie::Array::Lazy CPAN 上的模块,它为惰性数组提供了更丰富、更完整的接口(interface)。我自己没有使用过该模块,因此您的里程可能会有所不同。

祝一切顺利,

保罗

关于perl - Perl 6 的这一侧是否有针对惰性列表的 Perl 解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/109880/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com