Scala Seq的filterNot实现不接受另一个List作为函数输入参数

时间:2018-01-13 15:14:20

标签: scala

我正在使用收藏品,发现这有点奇怪:

  val a = Seq(1, 2, 3, 4, 5, 6)
  a.filterNot(Seq(1, 2, 3))

  //=> expected output: List(4, 5, 6)
  //=> actual: compiler error

<console>:13: error: type mismatch;
 found   : Int(3)
 required: Boolean
       a.filterNot(List(1, 2, 3))

但是,这个版本有效:

  val a = Seq(1, 2, 3, 4, 5, 6)
  a.filterNot(Set(1, 2, 3))

  //=> expected output: List(4, 5, 6)
  //=> actual: List(4, 5, 6)

我想知道为什么会这样。我读了Seq和Set定义,但发现了任何线索。

2 个答案:

答案 0 :(得分:3)

一个容易被忽视的事实是Set[A]延伸A => Boolean。换句话说,Set 谓词(检查成员身份的谓词)。这就是您可以将Set传递给filterNot

的原因

答案 1 :(得分:1)

区别在于apply()Seq个集合的Set方法。查看filterNot()

的定义
def filterNot(p: (A) ⇒ Boolean): Seq[A]

它需要一个函数,当输入一个元素时,返回一个布尔值。 Set这样做。 Seq没有。

Set(2,3,6).apply(0)  //res0: Boolean = false
Seq(2,3,6).apply(0)  //res1: Int = 2

因此,当您调用a.filterNot(Set(1, 2, 3))时,传递给Set的{​​{1}}将应用于Seq filterNot中的每个元素,这将导致a {1}}或true,这是false所需要的。