如果过滤太多,Scala for-comprehension?

Chr*_*est 0 scala for-comprehension

我有以下程序:(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)
  }
}
Run Code Online (Sandbox Code Playgroud)

它产生这样的输出:List((-1,-1), (-1,1), (1,-1), (1,1)) 我本来期望它只能过滤掉值,其中ab两个 0 -不是所有的值,其中任一 a或者b是0.

我可以通过将if子句改为此来获得我想要的行为:if (a,b) != (0,0)- 但是,我真的应该这样做吗?这是一个错误还是这种故意行为?举个例子,我对此感到惊讶.

Gar*_*eth 6

您拥有的过滤器的真值表是:

 a==0  |  b==0 | (a!=0 && b!=0)
--------------------------------
  0    |   0   |      0
  0    |   1   |      0
  1    |   0   |      0
  1    |   1   |      1
Run Code Online (Sandbox Code Playgroud)

而你说你想要的行为是:

 a==0  |  b==0 | !(a==0 && b==0)
--------------------------------
  0    |   0   |      0
  0    |   1   |      1
  1    |   0   |      1
  1    |   1   |      1
Run Code Online (Sandbox Code Playgroud)