scala偏函數

object CaseTest {
  def main(args:Array[String]){
    println(List(1,3,5,"seven") map{case i:Int =>i+1})
  }
}java

運行結果:
Exception in thread "main" scala.MatchError: seven (of class java.lang.String)
    at CaseTest$.$anonfun$main$1(CaseTest.scala:5)
    at CaseTest$.$anonfun$main$1$adapted(CaseTest.scala:5)
    at scala.collection.immutable.List.map(List.scala:287)
    at CaseTest$.main(CaseTest.scala:5)
    at CaseTest.main(CaseTest.scala)app

從新修改代碼:
println(List(1,3,5,"seven") collect{case i:Int => i+1})  
再次執行結果以下:
List(2, 4, 6)
爲何將map換成了collect以後就能夠成功執行呢?這是由於map函數接受一個普通的匿名函數,當適用於"seven"元素時出現類型匹配錯誤,而collect接受一個偏函數PartialFunction。case語句在scala中除了能夠被編譯爲匿名函數外,還能夠編譯爲一個偏函數PartialFunction,上面程序中編譯爲了PartialFunction.由上面執行的結果來分析:偏函數它只對會做用於指定類型的參數或指定範圍的參數實施做用,超出它的界定範圍以外的參數類型和值它會忽略。經過查看scala中的map和collect的源代碼能夠看到:
final override def map[B, That](f: A => B)(implicit bf: CanBuildFrom[List[A], B, That]): That = {....}ide

final override def collect[B, That](pf: PartialFunction[A, B])(implicit bf: CanBuildFrom[List[A], B, That]): That = {...}函數

trait PartialFunction[-A, +B] extends (A => B) { self =>      //看不懂源代碼中的這一行中的self =>???????也看不懂[-A,+B]?????
  import PartialFunction._   ui

  def isDefinedAt(x: A): Booleanthis

  def orElse[A1 <: A, B1 >: B](that: PartialFunction[A1, B1]): PartialFunction[A1, B1] =
    new OrElse[A1, B1] (this, that)
  //TODO: why not overload it with orElse(that: F1): F1?scala

  override def andThen[C](k: B => C): PartialFunction[A, C] =
    new AndThen[A, B, C] (this, k)ci

  def lift: A => Option[B] = new Lifted(this)it

  def applyOrElse[A1 <: A, B1 >: B](x: A1, default: A1 => B1): B1 =
    if (isDefinedAt(x)) apply(x) else default(x)io

  def runWith[U](action: B => U): A => Boolean = { x =>     val z = applyOrElse(x, checkFallback[B])     if (!fallbackOccurred(z)) { action(z); true } else false   } }  

相關文章
相關標籤/搜索