How to transfer Seq for-loop output to Stream output?

I tried to convert this Scala function to return a lazy stream instead of looking to get all the results and convert them from Seq to Stream when all the results are present. I feel the problem is (for (i <- 1 to 9; z <- solve (xs.updated (pos, i), pos)), output z) toStream .

Any advice is appreciated. Another solution I'm looking at is to return the result when it is found. With this solution, I probably have only 1 result. Thanks

isConflictAt(xs.updated(pos, 0), pos, xs(pos) - constraint checking function.

  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 } 
+6
source share
1 answer

for (i <- 1 to 9; z <- solve(???)) yield z means (1 to 9).flatMap{i => solve(???)} . See this answer .

To generate a lazy result, you must make a lazy source ( 1 to 9 ) using (1 to 9).view or (1 to 9).toStream .

Try the following:

 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 
+10
source

All Articles