Генерация Lazy Range в Юлии с Lazy.jl - PullRequest
1 голос
/ 21 октября 2019

При попытке расширить один из примеров из 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

1 Ответ

3 голосов
/ 21 октября 2019

Отображение ленивого потребности объектов для доступа к содержимому (хотя это спорно, является ли текущий 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
...