質問

理解のために、私は印刷されたステートメントを置くことはできません:

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
}

副作用であり、開発中のコードでのみ(これまでのところ)使用されているため、より良いアドホックソリューションはありますか?

副作用であることに加えて、なぜ私がそれを使用すべきではないのか深刻な問題がありますか?

1つのソリューションを適応させることが予想よりも難しい実際のコードを表示する更新:

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)) }

私の試みは次のとおりです。

  // 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, b, max))
      }
    }
  }

パートIIはコメントに属しますが、そこに書かれた場合は読むことができません - 最終的に削除するかもしれません。言い訳してください。

OK-これがコードレイアウトのレックスの最後の回答です:

  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, b, max))
      }
    }
  }

正しい解決策はありません

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top