fpiglet берет бесконечный список зависаний

Предполагая, что:

import static fpig.common.functions.FromOperators.*
import static fpig.groovylist.asfunlist.functions.InAndOutOfFunLists.*
import static fpig.funlist.functions.BaseFL.*
import static fpig.funlist.functions.Infinity.*

Я не могу понять, почему это работает:

def res= filter{it%7==0} << filter(SMALLER(20)) << naturalNumbers()
funlistOutTake(1) << res

и это работает:

def res= filter{it%7==0} << filter(SMALLER(50)) << naturalNumbers()
funlistOutTake(2) << res

но это замерзает

def res= filter{it%7==0} << filter(SMALLER(20)) << naturalNumbers()
funlistOutTake(2) << res

Я использую отличную консоль для этого и fpiglet 0.0.1-SNAPSHOT

Как примечание, когда это останавливается, скрипт прерывания не работает, кто-нибудь знает почему?

1 ответ

Решение

Я проверил в исправлении.

Проблема была в том, как работал funlistOutTake (2). Он хотел оценить хвост ленивого списка на последней (второй) записи. Другими словами, этот код:

def res= filter{it%7==0} << naturalNumbers()
funlistOutTake(2) << res

оценил бы все натуральные числа до 21.

Просто (очевидное) примечание:

def res= filter{it%7==0} << filter(SMALLER(20)) << naturalNumbers()
funlistOutTake(3) << res

не имеет возможности работать, потому что для получения третьего элемента в ленивом вычисленном списке 'res' второй фильтр: фильтр (SMALLER(20)) в конечном итоге будет вызван навсегда в надежде, что в конечном итоге он найдет третье число (>19), которое может быть оценивается по первому фильтру.

Обратите внимание, что take (n) имел ту же проблему и теперь должен быть исправлен.

Другие вопросы по тегам