为什么谓词不返回布尔值?

时间:2018-09-02 13:45:45

标签: scala predicate

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

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

但是它不能编译,似乎f(item)返回的值与布尔值不同,但是我不明白为什么。为了进行检查,我尝试这样做:

 var b = Boolean
 b = f(item)

此后,我收到一个错误“布尔类型的表达式与预期的Boolean.type类型不符”。但是我不明白这个解释。

能否请您帮助理解这里的问题?该函数的调用方式为:

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

3 个答案:

答案 0 :(得分:2)

谓词的确返回Boolean,但是for循环的语法错误。应该是这样的:

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)

答案 1 :(得分:2)

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

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

但是,如果您想使用一种理解来实现filter方法,则可以按照以下步骤进行操作

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

答案 2 :(得分:1)

对于language specification,要理解的JobService子句不能位于复合表达式内,例如一对大括号内。它必须是理解力返回表达式中的最外字。

正如Tim所解释的,您的MJobExecutor也必须位于特定的位置才能充当过滤器。在那个位置,它称为 guard子句(请参阅规范以了解确切的语法)。