为什么 predicate 不是 return 布尔值?

Why does predicate not return a Boolean?

我正在尝试完成一个非常简单的练习 - 过滤功能:

def filter[A](x: List[A], f: A => Boolean): List[A] = {
 for(item <- x){
  if(f(item))
   yield item
  }
 }

但是编译不通过,好像 f(item) returns 和 Boolean 不一样,但是我不明白,为什么。为了检查它,我尝试这样做:

 var b = Boolean
 b = f(item)

之后我得到一个错误 "expression of type Boolean doesn't conform to expected type Boolean.type"。但是我不明白这个解释。

能否请您帮助理解这里出了什么问题?该函数是这样调用的:

 val list = 1 :: 2 :: 3 :: 4:: 5 :: 6 :: Nil
 val list2 = filter[Int](list, _ % 2 == 0)

谓词执行 return Booleanfor 循环的语法是错误的。应该是这样的:

def filter[A](x: List[A], f: A => Boolean): List[A] =
  for (item <- x if f(item)) yield item

但这更好:

def filter[A](x: List[A], f: A => Boolean): List[A] =
  x.filter(f)

您可能知道可以直接使用 List 的 filter 方法:

def filter[A](x: List[A], f: A => Boolean): List[A] = x.filter(f)

但是如果您想使用 for-comprehension 实现您的 filter 方法,您可以按如下方式进行

def filter[A](x: List[A], f: A => Boolean): List[A] = {
  for {
    item <- x
    if (f(item))
  } yield item
}   

根据 language specification,for-comprehension 的 yield 子句不能位于复合表达式中,例如在一对牙套内。它必须是 for-comprehension 的 return 表达式的 最外层 单词。

正如 Tim 所解释的,您的 if 也必须位于特定位置以充当过滤器。在那个位置,它被称为 guard clause(请参阅规范以查看确切的语法)。