使用 Lazy.jl 在 Julia 中生成惰性范围
Lazy Range Generation in Julia with Lazy.jl
在尝试扩展 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
显示惰性对象需要访问其内容(尽管是否应更改当前的 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
在尝试扩展 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
显示惰性对象需要访问其内容(尽管是否应更改当前的 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