首页 > 解决方案 > 使用 Lazy.jl 在 Julia 中生成惰性范围

问题描述

在尝试从Lazy.jl扩展其中一个示例时,我遇到了一个评估不懒惰的问题。

使用README这个例子:

> esquares = @>> Lazy.range() map(x->x^2) filter(iseven);

> esquares[99]
39204

我试图通过允许将过滤器指定为参数来使其动态化,但它最终评估了一个无限列表:

> squares(filt) = @lazy @>> Lazy.range() map(x->x^2) filter(filt); 

> squares(iseven)

(4 16 36 64 100 144 196 256 324 400 484 576 676  ...   # this keeps printing until interrupting...)

我也试过:

> @lazy squares(iseven)  
(4 16 36 64 100 144 196 256 324 400 484 576 676  ...   # this also immediately returns the infinite list

标签: functional-programmingjulialazy-evaluation

解决方案


显示惰性对象需要访问其内容(尽管是否show应该更改当前方法尚有争议),这就是示例;esquares的 如此重要的原因。

考虑到这一点,您的代码可以正常工作:

julia> squares(filt) = @lazy @>> Lazy.range() map(x->x^2) filter(filt) # you don't need the `@lazy` here I think
squares (generic function with 1 method)

julia> squares(iseven);

julia> squares(iseven)[99]
39204

julia> squares(isodd)[99]
38809

推荐阅读