0

假设:

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

我为此使用了 groovy 控制台fpiglet 0.0.1-SNAPSHOT

作为旁注,当它冻结时,中断脚本不起作用,有人知道为什么吗?

4

1 回答 1

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”列表中获得第三个元素,第二个过滤器: filter(SMALLER(20)) 最终会被永远调用,希望最终它会找到第三个数字 (>19),它可以是由第一个过滤器评估。

注意,take(n) 有同样的问题,现在应该修复。

于 2014-05-12T01:02:19.807 回答