2014-03-26 39 views
3

我想在編制forgetBA後再編譯下面的代碼。在Scala中解析模糊隱式分辨率

trait ImplicitExample { 
    trait AA[T] 
    trait AB[T] extends AA[T] 
    trait BA[T] extends AA[T] 
    trait BB[T] extends AB[T] with BA[T] 

    object AA { 
    implicit def forgetAB[T: AB]: AA[T] = implicitly[AA[T]] 
    /*implicit*/ def forgetBA[T: BA]: AA[T] = implicitly[AA[T]] 
    } 

    object AB { 
    implicit def forgetBB[T: BB]: AB[T] = implicitly[AB[T]] 
    } 
    object BA { 
    implicit def forgetBB[T: BB]: BA[T] = implicitly[BA[T]] 
    } 
    object BB { 
    implicit object BBInt extends BB[Int] 
    } 

    val AAInt = implicitly[AA[Int]] 
} 

我明白,這將導致一個模糊的隱式解析的問題,所以我在尋找一種方式來表示對在另外一個隱含的分辨率的偏好。

我聽說過以某種方式插入中間特徵的謠言可能會有幫助,但我似乎無法找到解釋。

+0

我的'真實世界'的例子是EuclideanRing,OrderedEuclideanRing,Field和OrderedField。 –

回答

4

慣用的伎倆是寫這樣的:

trait LowPriorityAAInstances { 
    implicit def forgetAB[T: AB]: AA[T] = implicitly[AA[T]] 
} 

object AA extends LowPriorityAAInstances { 
    implicit def forgetBA[T: BA]: AA[T] = implicitly[AA[T]] 
} 

這會給forgetBA優先尋找的T針對有中BA實例的的AA實例時(同時仍編譯即使有周圍有AB的實例)。

命名完全是約定的問題,但最好使用它來表明您只是以這種方式拆分AA的定義以適應隱式搜索機制。