簡體   English   中英

Scala通用函數值(匿名函數) - 缺少參數類型(錯誤)

[英]Scala Generic Function Values (Anonymous Function) - Missing Parameter Type (Error)

我是Scala的新手( Scala代碼運行器版本2.7.7.final ),我真的不明白為什么當我們使用高階函數時它需要調用者提供參數類型。

在下面的示例中,我有一個獨立的對象( Util ),它有一個功能。 但是在Main塊中,調用者必須將參數類型傳遞給匿名函數。

為什么Scala不從Array類型(即String )推斷出函數的類型? 有沒有辦法做到這一點?

object Util {

 // Just for fun! Suppose that the arrayOne and arrayTwo are all the same length.
 // will swap the elements from arrayOne to ArrayTwo.
  def swap[T](arrayOne:Array[T], arrayTwo:Array[T] , f:(T,T) =>(T,T)) {
    for(i <- 0 until (arrayOne.length min arrayTwo.length)){
      val (left, right) = f(arrayOne(i),arrayTwo(i))
      arrayOne(i) = left
      arrayTwo(i) = right
    }
  }
}

object Main extends Application {

   val arrayOne = Array("A","B","C")
   val arrayTwo = Array("D","E","F")

 //If not specified the type String,the compiler throws "Missing Parameter Type" error

Util swap(arrayOne, arrayTwo,(elem1:String,elem2:String)=>(elem2,elem1))

}

它沒有推斷出T的類型,因為此時它唯一需要的是arrayOnearrayTwo 但是,Scala不使用一個參數的類型來推斷另一個參數的類型,可能是因為它會導致方法重載問題。 但是,它適用於你的咖喱:

Object Util {

 // Just for fun! Suppose that the arrayOne and arrayTwo are all the same length.
 // will swap the elements from arrayOne to ArrayTwo.
   def swap[T](arrayOne:Array[T], arrayTwo:Array[T])(f:(T,T) =>(T,T)) : Unit = {
     var i = 0   
        var tuple :Tuple2[T,T] = null
       while(i < arrayOne.length && i < arrayTwo.length){
         tuple =f(arrayOne(i),arrayTwo(i))
         arrayOne(i) = tuple._1
         arrayTwo(i) = tuple._2
         i+=1
        }
      }
}

object Main extends Application {

   // val works fine below -- the object is mutable
   val arrayOne = Array("A","B","C")
   val arrayTwo = Array("D","E","F")

   (Util swap(arrayOne, arrayTwo))((elem1,elem2)=>(elem2,elem1))
   // The weird parenthesis is caused by mixing operator notation and currying
   // One could also write it like this:
   // Util.swap(arrayOne, arrayTwo)((elem1,elem2)=>(elem2,elem1))
}

它的工作原理如果你理解它是一個curried方法實際上是一個方法接收第一個參數列表並返回一個需要其他(或其他)參數列表的函數。 因此,可以在第一個參數列表中確定重載,因此第二個參數列表可以利用推斷類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM