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