加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读