I have tried to convert this Scala function to return a lazy Stream instead of eagerly retrieve all the results and convert them from a Seq to Stream when all the results are present. I have feeling the issue lies in (for (i <- 1 to 9; z <- solve(xs.updated(pos, i), pos)) yield z) toStream.
Any advice is appreciated. Another solution I am looking at is to return a result when it is found. With this solution I probably have only 1 result returned. Thanks
isConflictAt(xs.updated(pos, 0), pos, xs(pos)
is a constraint check 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
}