可以明确定义谓词吗?

时间:2016-06-14 21:18:47

标签: scala

在对象下面过滤并映射案例类:

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 };

3 个答案:

答案 0 :(得分:7)

当然 - 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中定义函数,只要你最终得到一个具有适当输入和输出类型的函数,它们都可以工作。

答案 1 :(得分: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 :(得分:2)

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