尝试在Scala中编写通用筛选函数

尝试在Scala中编写通用筛选函数,scala,Scala,下面提到了我编写的代码 def genericFilter[A,B](f:(A) => B, list:Seq[A]):Seq[B] = { for { x <- list ; if(f(x)!=false) } yield f(x) } 我无法打印列表的值请尝试以下操作: def genericFilter[A](f:(A) => Boolean, list:Seq[A]):Seq[A] = { for { x <- list ; if(f

下面提到了我编写的代码

def genericFilter[A,B](f:(A) => B, list:Seq[A]):Seq[B] = {  
  for { x <- list ; if(f(x)!=false) } yield f(x)  
}
我无法打印列表的值

请尝试以下操作:

    def genericFilter[A](f:(A) => Boolean, list:Seq[A]):Seq[A] = {
    for { x <- list ; if(f(x)) } yield x
  }

println(genericFilter((x:Int)=>x%2==0, Seq(1,2,3,4)))
def genericFilter[A](f:(A)=>Boolean,list:Seq[A]):Seq[A]={
对于{x%2==0,Seq(1,2,3,4)))
它将打印包含满足函数f的元素的列表。

请尝试以下操作:

    def genericFilter[A](f:(A) => Boolean, list:Seq[A]):Seq[A] = {
    for { x <- list ; if(f(x)) } yield x
  }

println(genericFilter((x:Int)=>x%2==0, Seq(1,2,3,4)))
def genericFilter[A](f:(A)=>Boolean,list:Seq[A]):Seq[A]={
对于{x%2==0,Seq(1,2,3,4)))
它将打印包含满足函数f的元素的列表。

更多功能: 您可以使用foldRight遍历列表并根据条件进行筛选

val l = List.tabulate(10)(_ + 1)
def filter[T](l: List[T])(op: T => Boolean): List[T] = {
  l.foldRight(List[T]())((b, a) => if(op(b)) b :: a else a)
}
filter(l)(_ > 3)
更多功能: 您可以使用foldRight遍历列表并根据条件进行筛选

val l = List.tabulate(10)(_ + 1)
def filter[T](l: List[T])(op: T => Boolean): List[T] = {
  l.foldRight(List[T]())((b, a) => if(op(b)) b :: a else a)
}
filter(l)(_ > 3)

嗨@VenkateshPrasadMJ,问题是如果你的函数从A到B,B是一个
Boolean
,那么每个输出都将是
Boolean
。既然你排除了所有未通过谓词的元素,那么产生的
Seq
将始终填充
true
s。还有,为什么要将B设为一个通用参数呢它是一个过滤函数,结果必须始终是一个
布尔值
,如果不是,您如何检查它?如果您希望原始值是,请尝试使用
yield x
,而不是
f(x)
。尝试过了,但是yield x返回了一个类型不匹配的错误:x.type(与基础类型a)必需:B必须将函数签名更改为
def genericFilter[A,B](f:(A)=>Boolean,list:Seq[A]):Seq[A]
Hi Luis,我明白了,那么我如何才能实现我的实际目标,即通过执行始终为真的布尔检查来获取列表值。Hi@VenkateshPrasadMJ,问题是,如果函数从a到B,B是一个
布尔
,那么每个输出都将是一个
布尔
。而且,由于排除了所有失败的元素谓词,即生成的
Seq
将始终填充
true
s。另外,为什么要将B作为一个通用参数?因为它是一个过滤函数,所以结果必须始终是一个
Boolean
,如果不是,您如何对照它进行检查?尝试使用
产生x
而不是
f(x)
如果您希望原始值是屈服的。尝试了这一点,但是屈服x返回给我一个类型不匹配的错误:x.type(与基础类型a)required:B必须将函数签名更改为
def genericFilter[a,B](f:(a)=>Boolean,list:Seq[a]):Seq[a]
Hi Luis,我明白了,那么我该如何实现我的实际目标,即通过执行布尔检查来获取列表值,这始终是真的。我只想指出,B没有在任何地方使用,因此您可以(并且应该)从签名中删除它。另外
if(f(x)!=false)
是一种代码味道,只需编写
if(f(x))
@LuisMiguelMejíaSuárez谢谢你指出。我已经更正了。理解了。非常感谢。感谢你的快速回复:)只是想指出,B没有在任何地方使用,所以你可以(而且应该)从签名中删除它。另外
如果(f(x)!=false)
是一种代码味道,只要写
如果(f(x))
@LuisMiguelMejíaSuárez感谢您的指点。我已经更正了。理解。非常感谢。感谢您的快速回复:)