2013-04-04 37 views
6

我试图转换这个Scala函数来返回一个懒惰的流,而不是热切地检索所有的结果,并将它们从一个序列转换为流,当所有的结果存在。我感觉问题在于(对于(i <-1至9; z <-soll(xs.updated(pos,i),pos))yield z)toStream如何将一个for-loop Seq输出重写为Stream输出?

任何意见表示赞赏。我正在看的另一个解决方案是在找到它时返回结果。有了这个解决方案,我可能只有1个结果返回。谢谢

isConflictAt(xs.updated(pos, 0), pos, xs(pos)是一个约束检查功能。

def solve(xs : List[Int], pos: Int): Stream[List[Int]] = { 
    if (!isConflictAt(xs.updated(pos, 0), pos, xs(pos))) { 
     val pos = xs.indexOf(0) 
     if (pos < 0) {println(xs); Stream(xs) } else (for (i <- 1 to 9; z <- solve(xs.updated(pos, i), pos)) yield z) toStream 
    } else Stream.empty 
    } 

回答

10

for (i <- 1 to 9; z <- solve(???)) yield z表示(1 to 9).flatMap{i => solve(???)}。请参阅this answer

要生成惰性结果,您应该使用(1 to 9).view(1 to 9).toStream来源(1 to 9)。

试试这个:

scala> def solve(pos: Int): Stream[List[Int]] = { 
    | println(pos) 
    | Stream.fill(3)((1 to pos).map{ _ => util.Random.nextInt}.toList) 
    | } 
solve: (pos: Int)Stream[List[Int]] 

scala> for{ 
    | i <- (1 to 9).toStream 
    | z <- solve(i) 
    | } yield z 
1 
res1: scala.collection.immutable.Stream[List[Int]] = Stream(List(-1400889479), ?) 

scala> res1.force 
2 
3 
4 
5 
6 
7 
8 
9 
相关问题