我正在嘗試編寫一個簡單的查詢monad,並且遇到問題,我的通用類型註釋正確。Scala推斷的類型參數 - 類型範圍推斷爲'Nothing'
我第一次嘗試去如下(大大簡化了簡潔)
case class Person(val name: String)
abstract class Schema[T]
object People extends Schema[Person]
case class Query[U <: Schema[T], T](schema: U) { <---- Type signature
def results: Seq[T] = ...
def where(f: U => Operation) = ...
}
class TypeText extends Application {
val query = Query(People) <---- Type inference fails
}
編譯器不喜歡這一點,因爲它無法推斷「T」的類型。
error: inferred type arguments [People.type,Nothing] do not conform to method apply's type parameter bounds [U <: Schema[T],T]
雖然嘗試我發現,使用視圖的邊界,而不是按預期工作
case class Query[U <% Schema[T], T](schema: U) {
(注意使用的角度約束「<%」,而不是約束型「<」)
然而,在我對類型系統有限的理解中,因爲我期待Schema [T]的實際子類(而不僅僅是可轉換性),所以我會假定類型綁定「<:」是在這裏使用的正確界限?
如果是這樣的話,我錯過了什麼 - 我怎麼給編譯器足夠的提示,以便在使用類型邊界而不是視圖邊界時正確推斷T?
謝謝。我曾經看到過這種語法,並在想這是什麼意思。 – 2013-05-01 06:36:24
我不認爲這個答案是正確的。請在我的答案底部查看我的回覆(此評論不會爲討論提供足夠的空間)。 – 2013-05-01 09:01:01
@Régis你是對的。我誤解了規範中的範圍規則。這確實是一個推理問題,正如你在答案中所描述的那樣。也就是說,使用隱式證據參數是對關係進行編碼並支持所需推理的最簡單方法。 – 2013-05-01 19:51:11