我正在尝试完成一个非常简单的练习-过滤器功能:
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)
答案 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子句(请参阅规范以了解确切的语法)。