2012-12-08 20 views
0

我有以下程序:(斯卡拉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)) 我會它預期到ab僅濾除值兩者 0 - 並不是所有的值,其中要麼ab爲0

我可以改變,如果從句這得到我想要的行爲:if (a,b) != (0,0) - 但是,我應該真的有至?這是一個錯誤還是這種故意行爲?舉個例子,我對此感到驚訝。

+1

您需要使用'(A == 0 && b! == 0)'來獲得你想要的行爲。 – Gareth

+0

或'a!= 0 || b!= 0'基本上是[相同的](http://en.wikipedia.org/wiki/De_Morgan's_laws) –

回答

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