0

私は次のプログラムを持っています:(Scala 2.9.2、Java6)

object Forcomp {
  def main(args: Array[String]): Unit = {
    val xs = List(-1, 0, 1)
    val xss = for (a <- xs; b <- xs if a != 0 && b != 0) yield (a,b)
    println(xss)
  }
}

これにより、次の出力が生成されます。とが両方ともList((-1,-1), (-1,1), (1,-1), (1,1))0 である値のみを除外することを期待していましたが、または0であるすべての値ではありません。ab ab

if-clauseを次のように変更することで、必要な動作を得ることができます。–if (a,b) != (0,0)しかし、本当にそうする必要がありますか?これはバグですか、それとも意図的な動作ですか?私は、これに驚いた。

4

1 に答える 1

6

あなたが持っているフィルターの真理値表はこれです:

 a==0  |  b==0 | (a!=0 && b!=0)
--------------------------------
  0    |   0   |      0
  0    |   1   |      0
  1    |   0   |      0
  1    |   1   |      1

一方、あなたが望む行動は次のとおりです。

 a==0  |  b==0 | !(a==0 && b==0)
--------------------------------
  0    |   0   |      0
  0    |   1   |      1
  1    |   0   |      1
  1    |   1   |      1
于 2012-12-08T18:41:40.373 に答える