Scala для понимания, если фильтровать слишком много?

У меня есть следующая программа: (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)) Я ожидал, что он отфильтрует только те значения, где a и b равны оба 0, а не все значения, где либо a или b равны 0.

Я могу получить желаемое поведение, изменив предложение if на это: if (a,b) != (0,0) — однако, действительно ли мне это нужно? Это ошибка или это преднамеренное поведение? Меня, например, это удивило.


person Chris Vest    schedule 08.12.2012    source источник
comment
Вам нужно использовать !(a==0 && b==0), чтобы получить желаемое поведение.   -  person Gareth    schedule 08.12.2012
comment
Или a != 0 || b != 0, что в основном то же самое   -  person om-nom-nom    schedule 08.12.2012


Ответы (1)


Таблица истинности для вашего фильтра такова:

 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
person Gareth    schedule 08.12.2012