2017-02-11 94 views
1

(斯卡拉2.11.8)斯卡拉的類型推斷和多參數列表

考慮下面的代碼:

trait Class[A] { 
    def f1[B >: A](arg1: Int)(ord: Ordering[B]): Int 

    def f2[B >: A](arg1: Int, ord: Ordering[B]): Int 

    def f[B >: A](ord: Ordering[B]): Int = { 
    f1(123)(ord) // Compilation error! 
    f2(123, ord) // OK 
    } 
} 

這裏,線f1(123)(ord)提高type mismatch; found : Ordering[B] required: Ordering[A] Note: B >: A, but trait Ordering is invariant in type T. You may wish to investigate a wildcard type such as _ >: A. (SLS 3.2.10)

如果我們將調用f1[B](123)(ord),錯誤消失。

爲什麼多個參數列表的存在會混淆typechecker?這是一個錯誤還是預期的結果?

回答

4

這是不是一個錯誤 - 分離成參數列表意味着該類型參數是基於第一參數單獨列表上推斷:

f1(123)(ord) 

可以改寫爲:

val partiallyApplied = f1(123) 
partiallyApplied(ord) 

現在 - 什麼是partiallyApplied的類型?由於類型參數沒有明確設置,並且沒有參數/返回類型用於推斷,所以類型參數被推斷爲A(沒有具體B尚未!所以partiallyApplied的類型是(Ordering[A]) => Int),因此將它與後來的Ordering[B]給出了例外。

相反,當調用:

f2(123, ord) 

由於ord具有類型Ordering[B],類型參數可以被推斷爲B,因此編譯成功。