为什么 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 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)
您可能知道可以直接使用 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(请参阅规范以查看确切的语法)。
我正在尝试完成一个非常简单的练习 - 过滤功能:
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 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)
您可能知道可以直接使用 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(请参阅规范以查看确切的语法)。