以下對象過濾器和映射的情況下類:可以明確定義謂詞嗎?
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')。這樣編譯器就知道參數類型,並且它可以平凡地推斷出結果類型。因此,指定預期類型(如答案中所示)不是必需的。 –