2017-06-01 10 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

おかげで値の影響を受けているドメインを持つことです!それを試してみる。確かに、これは[Structural Type](http://ktoso.github.io/scala-types-of-types/#structural-type)ではなく、リフレクション指向のランタイムペナルティが発生しません_right?_ – Yaneeve

+0

これは、型メンバを使用します。この型メンバは、実行時の観点から型パラメータと同等です。 – OlivierBlanvillain

+0

ありがとう、それは動作するようです。なぜ私はパスに依存するタイプで管理していなかったのだろうかと思います。まったく同じ私はあなたの答えを受け入れるだろう – Yaneeve

関連する問題