以下对象过滤器和映射的情况下类:可以明确定义谓词吗?
object PartialTest extends App {
case class c()
val l = List(c)
l.filter({ case c => true })
l.map({ case c => true })
}
能为filter
和map
谓词明确定义?
类似于: val myPredicate = { case c => true };
?
以下对象过滤器和映射的情况下类:可以明确定义谓词吗?
object PartialTest extends App {
case class c()
val l = List(c)
l.filter({ case c => true })
l.map({ case c => true })
}
能为filter
和map
谓词明确定义?
类似于: val myPredicate = { case c => true };
?
Sure- filter
和map
只是普通的方法是采取一个函数:
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中定义函数,只要您最终得到具有适当输入和输出类型的函数,它们都可以工作。
是,下面的编译:
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)
}
你的想法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中有详细描述。
谢谢,我最初的想法是'def fun = {case c => true}'应该编译,但这不会创建所需的输入和输出类型...... –
@ blue-sky您只需指定类型'c':'c:C => true'(注意缺少'case')。这样编译器就知道参数类型,并且它可以平凡地推断出结果类型。因此,指定预期类型(如答案中所示)不是必需的。 –