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

println在scala for-comprehension

发布时间:2020-12-16 09:43:06 所属栏目:安全 来源:网络整理
导读:在一个理解中,我不能只是一个打印声明: def prod (m: Int) = { for (a - 2 to m/(2*3); print (a + " "); b - (a+1) to m/a; c = (a*b) if (c m)) yield c} 但是我可以用虚拟作业来容易地规避它: def prod (m: Int) = { for (a - 2 to m/(2*3); dummy = p
在一个理解中,我不能只是一个打印声明:

def prod (m: Int) = {
  for (a <- 2 to m/(2*3);
    print (a + "  ");
    b <- (a+1) to m/a;
    c = (a*b) 
    if (c < m)) yield c
}

但是我可以用虚拟作业来容易地规避它:

def prod (m: Int) = {
  for (a <- 2 to m/(2*3);
    dummy = print (a + "  ");
    b <- (a+1) to m/a;
    c = (a*b) 
    if (c < m)) yield c
}

作为副作用,只有在开发中的代码中才使用(到目前为止),是否有更好的临时解决方案?

是否有严重的问题,为什么我不应该使用它,除了副作用?

更新显示真正的代码,适应一个解决方案比预期更难:

从与Rex Kerr的讨论中,必要性已经增加,以显示原始代码,这有点复杂,但似乎并不与问题(2x .filter,最后调用一个方法)相关,但是当我试图将Rex的模式应用到它我失败了,所以我发贴在这里:

def prod (p: Array[Boolean],max: Int) = {
    for (a <- (2 to max/(2*3)).
        filter (p);
      dummy = print (a + "  ");
      b <- (((a+1) to max/a).
         filter (p));
      if (a*b <= max)) 
        yield (em (a,b,max)) }

这是我的尝试 – (b * a).filter是错误的,因为结果是一个int,而不是一个可过滤的int集合:

// wrong: 
  def prod (p: Array[Boolean],max: Int) = {
    (2 to max/(2*3)).filter (p).flatMap { a =>
      print (a + " ")
      ((a+1) to max/a).filter (p). map { b => 
        (b * a).filter (_ <= max).map (em (a,max))
      }
    }
  }

第二部分属于意见,但不能读,如果写在那里 – 也许我删除它。请原谅

好的 – 这里是Rex的最后一个答案在代码布局:

def prod (p: Array[Boolean],max: Int) = {
    (2 to max/(2*3)).filter (p).flatMap { a =>
      print (a + " ")
      ((a+1) to max/a).filter (b => p (b) 
        && b * a < max).map { b => (m (a,max))
      }
    }
  }

解决方法

这是你需要写的:

scala> def prod(m: Int) = {
     |   for {
     |     a <- 2 to m / (2 * 3)
     |     _ = print(a + " ")
     |     b <- (a + 1) to (m / a)
     |     c = a * b
     |     if c < m
     |   } yield c
     | }
prod: (m: Int)scala.collection.immutable.IndexedSeq[Int]

scala> prod(20)
2 3 res159: scala.collection.immutable.IndexedSeq[Int] = Vector(6,8,10,12,14,16,18,15,18)

(编辑:李大同)

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

    推荐文章
      热点阅读