2012-05-27 60 views
4

在Scala中調用帶有類型參數的方法時,我經常嘗試安排代碼,以便類型推理程序可以找出有關類型參數的內容,而不需要我填寫它們。在某些情況下,它會失敗,我必須手動提供它們。大多數情況下,這不是問題,但對於具有多個類型參數的方法(例如,大多數方法需要隱式的CanBuildFrom),我想知道是否有方法通過僅給出類型推理其中一個需要的類型參數,並要求它嘗試猜測其他的參數。它看起來像內部,它一定是做這樣的事情,因爲它有時會產生「預期類型A[B, ?]」的錯誤消息,但得到了A[C, D]「,這意味着在A這兩個類型參數中,它可以找出第一個一個B但沒有關於第二個的信息。在斯卡拉,我可以(一些SIP允許我)只指定一般類型的某些類型參數嗎?

使用案例:Tomasz’s question,在此代碼:

def firstAndLast[CC, A, That](seq: CC)(implicit asSeq: CC => Seq[A], cbf: CanBuildFrom[CC, A, That]): That = { 
    val b = cbf(seq) 
    b += seq.head 
    b += seq.last 
    b.result 
} 

不能List("abc", "def") map firstAndLast被調用,而這會工作:

List("abc", "def") map firstAndLast[String, Char, String] 

在這個例子中,我的問題歸結爲:有什麼辦法可以告訴類型推理:CC參數應該是String,並要求它自己找出關於AThat?喜歡的東西,在本質上,

List("abc", "def") map firstAndLast[CC = String] 

List("abc", "def") map firstAndLast[String, <guess>, <guess>] 

我知道這些線路不能正常工作;我正在尋找一種解決方法(或者爲未來的語言功能提供指導,這些功能已經被討論過並且可能導致這種情況)。

+4

https://groups.google.com/d/topic/scala-debate/FW-Sx_S3kys/discussion – Debilski

+2

你可以做到這一點在斯卡拉3.0,約3斯卡拉一些更多的信息:HTTPS: //groups.google.com/forum/#!topic/scala-language/PV4q6O1qIh8 – Eastsun

回答

1

不,你不能。有type lambda s和type本身可用於類型(如類和特徵),但不適用於類型參數。例如:

// Declaring a type alias 
type StringMap[Elem] = Map[String, Elem] 

// Calling an `def f[M[_]]` but passing a `Map` 
f[({type l[A]=Map[String,A]})#l] 

// note that f could also be called like this: 
f[StringMap] 
相關問題