2016-06-14 64 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中有詳細描述。

相關問題