2011-04-07 46 views
2

仍在掙扎着使用this.types(單例類型)。假設這樣的場景:定義一種方法,其返回類型是該方法的參數的單例類型

trait Sys[A <: Access] { 
    def in[T](v: String): AccessPrepare[A] 
} 

trait AccessPrepare[A <: Access] { 
    val a: A 
    def apply[T](fun: a.type => T): T 
} 

object Ref { 
    def single[A <: Access, V](v: V)(implicit a: A): Ref[A, V] = ??? 
} 
trait Ref[A, V] 

trait Access { 
    def set(r: Ref[this.type, Int]): Unit 
} 

下失敗:

def test(sys: Sys[Access]): Unit = 
    sys.in("v1") { implicit a => 
    val r = Ref.single(44) 
    a.set(r) 
    } 

因爲很顯然rRef[Access, Int]型的,而不是Ref[a.type, Int]。我的猜測是,問題是我需要像

def single[A <: Access, V](v: V)(implicit a: A): Ref[a.type, V] = ... 

未編譯爲因「非法方法依賴型」行......

任何想法我怎麼能解決這個問題。需求是我沒有明確註釋帶有類型的調用。也就是說,我做了而不是,想要寫出Ref.single[a.type, Int](44)(a)是爲了便於理解。


編輯

作爲一個澄清,與參考答案「FYI,並關閉這個問題」線程Constraining an operation by matching a type parameter to an argument's path-dependent type - 我想有除了是創建對象的可能性(參考)不使用工廠方法訪問但在某處以外(例如與new語句)。因爲系統不能被Access的定義所限制,所以我必須能夠用更多的對象來擴展它。

+0

我又增加了一個問題:http://stackoverflow.com/questions/5575030/driving-a-singleton-type - 我認爲如果我能解決這個問題,這個問題也將因此而得到解決(我希望) – 2011-04-07 01:52:30

回答

1

你有幾種可能性。使用Scala 2.8/2.8.1,您可以使用私人選項-Ydependent-method-types,然後用

def single[ A <: Access, V ](v: V)(implicit a: A) : Ref[ a.type, V ] = // ... 

編譯罰款您的解決方案。

如果你想避免依賴的方法類型,因爲它是一個私人的選擇,你仍然可以使你的第一個建議通過明確鍵入調用Ref.single編譯:

val r = Ref.single[a.type, Int](44) 

您需要指定類型,不過,因爲單身人士類型從未被推斷過。你的問題是不一樣的,但相關的問題,單身人士類型不推斷:看到How to correctly type-annotate this HList?

+0

非常好,非常感謝。我第一次聽到依賴方法類型選項。所以類型系統_can_可以處理它。我想知道這將在未來的Scala版本中被激活或公開嗎? – 2011-04-11 00:04:18

相關問題