2010-03-25 23 views
9

Scala'da yeni (Scala kod koşucusu sürüm 2.7.7.final) ve neden arayanın neden gerektirdiğini anlamıyorum. Yüksek mertebeden fonksiyonlar kullandığımızda parametre tipi sağlamak.Scala Genel İşlev Değerleri (Anonim İşlev) - Eksik Parametre Türü (Hata)

Aşağıdaki örnekte, tek bir işlevi olan tek bir stand nesnesine (Util) sahibim. Ancak, Main satırında, arayan parametre tipini anonim işleve iletmelidir.

Scala neden işlev türünü Array türünden (yani String) türetmiyor? Bunu yapmanın bir yolu var mı? sahip olduğu tek şey arrayOne ve arrayTwo olurdu bu noktada gitmeyi çünkü

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)) 

} 
+0

Benim için çalışır, yalnızca Util nesnesinde bir} eksik. –

+0

@Thomas çalışmasında türünü belirttiğinden işe yarar. :-) –

+0

@Daniel Tip açıklaması, bu kodu bana rahatsız eden son şey. Bunu düzeltmek kaba olacak mı diye merak ediyorum. Son çizgiye kadar kaybolan dikkat. –

cevap

14

O T türünü ifade etmez. Ancak, Scala, bir diğerinin türünü anlamak için bir parametrenin türünü kullanmaz, muhtemelen yöntem aşırı yüklenmesinde sorunlara neden olur. Ancak, işler bunu köri eğer:

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

bunu bir Körili yöntem ilk parametre listesi alınması ve diğer gerektiren bir işlev dönen bir yöntem aslında olmasıdır köri eğer iyi çalışıyor nedeni (veya diğerleri) parametre listesi. Bu nedenle, ilk parametre listesinde aşırı yüklenmeye karar verilebilir, böylece ikinci parametre listesi, türetilmiş türlerden yararlanabilir.

+0

Teşekkürler Daniel .. Cevabınızı gerçekten kullanın! – CHAPa

İlgili konular