scala – 如何将for循环Seq输出重写为Stream输出?
发布时间:2020-12-16 09:00:01 所属栏目:安全 来源:网络整理
导读:我试图将此 Scala函数转换为返回惰性流,而不是急切地检索所有结果,并在所有结果都存在时将它们从Seq转换为Stream.我感觉问题在于(for(i - 1到9; z - solve(xs.updated(pos,i),pos))yield z)toStream. 任何建议表示赞赏.我正在寻找的另一个解决方案是在找到结
我试图将此
Scala函数转换为返回惰性流,而不是急切地检索所有结果,并在所有结果都存在时将它们从Seq转换为Stream.我感觉问题在于(for(i < - 1到9; z< - solve(xs.updated(pos,i),pos))yield z)toStream. 任何建议表示赞赏.我正在寻找的另一个解决方案是在找到结果时返回结果.有了这个解决方案,我可能只返回了1个结果.谢谢 isConflictAt(xs.updated(pos,0),pos,xs(pos)是约束检查函数.
def solve(xs : List[Int],pos: Int): Stream[List[Int]] = { if (!isConflictAt(xs.updated(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,pos)) yield z) toStream } else Stream.empty } 解决方法
对于(i <-1至9; z < - 求解(???)),产率z表示(1至9).flatMap {i =>解决(???)}.见
this answer.
要生成延迟结果,您应该使用(1到9).view或(1到9).toStream使源(1到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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
热点阅读