2016-06-14 52 views
1

以下对象过滤器和映射的情况下类:可以明确定义谓词吗?

object PartialTest extends App { 

    case class c() 
    val l = List(c) 

    l.filter({ case c => true }) 
    l.map({ case c => true }) 

} 

能为filtermap谓词明确定义?

类似于: val myPredicate = { case c => true };

回答

7

Sure- filtermap只是普通的方法是采取一个函数:

scala> case class C() 
defined class C 

scala> val l = List(C()) 
l: List[C] = List(C()) 

scala> val alwaysTrue: C => Boolean = Function.const(true) 
alwaysTrue: C => Boolean = <function1> 

scala> l.filter(alwaysTrue) 
res0: List[C] = List(C()) 

(请注意,我已经改变了一些东西惯用表达,并因为你可能不希望的名单案例类的同伴对象)

如果你想使用部分功能语法(case),你可以这样做,以及:

scala> val anotherVersion: C => Boolean = { 
    | case _ => true 
    | } 
anotherVersion: C => Boolean = <function1> 

scala> l.filter(anotherVersion) 
res1: List[C] = List(C()) 

有很多方法可以在Scala中定义函数,只要您最终得到具有适当输入和输出类型的函数,它们都可以工作。

+0

谢谢,我最初的想法是'def fun = {case c => true}'应该编译,但这不会创建所需的输入和输出类型...... –

+1

@ blue-sky您只需指定类型'c':'c:C => true'(注意缺少'case')。这样编译器就知道参数类型,并且它可以平凡地推断出结果类型。因此,指定预期类型(如答案中所示)不是必需的。 –

3

是,下面的编译:

object PartialTest extends App { 

case class C() 
val l = List(C()) 

val myPredicate: PartialFunction[C, Boolean] = { 
    case cv: C => true 
} 

l.filter(myPredicate) 

l.map(myPredicate) 

}

2

你的想法val myPredicate = { case c => true }的问题很简单:为了一个匿名函数来编译,编译器需要知道参数类型( S)。它可以明确指定:val myPredicate = { c: C => true }。否则,编译器需要一个预期类型,可以通过使用函数作为方法参数(发生在您的原始代码中)或通过指定myPredicate的类型(如其他2个答案中)来给出。这在http://www.scala-lang.org/files/archive/spec/2.11/06-expressions.html#anonymous-functions中有详细描述。

相关问题