2017-06-01 48 views
2

我想模擬某些相互依賴關係案例類別的字段之間,使rhs字段的可能值將取決於類型lhs如何模擬案例類的字段之間的相關性?

在下面的例子中,我沒有設法編寫type B = A.B - 它不會編譯,只有type B = A#B。毫不奇怪的是,在下面的例子中,這行代碼會編譯:SomeDomain.Foo(SomeDomain.Brr, SomeDomain.Bee.Pooh),但這樣做會失敗。

顯然我做錯了什麼。這裏有一個小的修復嗎?或者,我應該完全採取不同的方法嗎?

// Entering paste mode (ctrl-D to finish) 

trait Domain { 
    trait Bar { 
    type B 
    } 
    type A <: Bar 
    type B = A#B 

    case class Foo(lhs: A, rhs: B) 
} 

object SomeDomain extends Domain { 
    sealed trait Baz extends Bar { 
    sealed trait Inner 

    override type B = Inner 
    } 

    case object Brr extends Baz { 

    case object Strawberry extends Inner 
    case object Raspberry extends Inner 
    } 

    case object Bee extends Baz { 

    case object Honey extends Inner 
    case object Pooh extends Inner 
    } 

    override type A = Baz 
} 


val foo = SomeDomain.Foo(SomeDomain.Brr, SomeDomain.Bee.Pooh) 
val f1= foo.lhs 
val f2 = foo.rhs 

// Exiting paste mode, now interpreting. 

defined trait Domain 
defined object SomeDomain 
foo: SomeDomain.Foo = Foo(Brr,Pooh) 
f1: SomeDomain.A = Brr 
f2: SomeDomain.B = Pooh 
+0

你說的目的被擊敗,但我覺得你的目的不明確......你怎麼打算用這個? –

+0

@CyrilleCorpet,目的,如果我不清楚,對不起,是讓Foo建立一個域,其中'B'的可能值受'A' – Yaneeve

回答

2

最可靠的方法是使用一種構件,一個明確的類型參數:

trait T { type O } 

case class Foo[A](t: T { type O = A }, a: A) 
+0

中值的影響,謝謝!會嘗試一下。只是爲了確認,這不是[結構類型](http://ktoso.github.io/scala-types-of-types/#structural-type),並且不會導致其面向反射的運行時損失,_right?_ – Yaneeve

+0

它使用一個類型成員,從運行時的角度來看,它相當於一個類型參數。 – OlivierBlanvillain

+0

謝謝,它似乎工作。我想知道爲什麼我沒有通過路徑依賴類型進行管理。同樣的,我會接受你的回答 – Yaneeve