scala - 如何对案例类字段之间的相互依赖关系进行建模?

标签 scala path-dependent-type

我想对案例类字段之间的一些相互依赖性进行建模,以便 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

最佳答案

最可靠的方法是使用带有显式类型参数的类型成员:

trait T { type O }

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

关于scala - 如何对案例类字段之间的相互依赖关系进行建模?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44302807/

相关文章:

java - 如何在没有内存溢出的情况下检查图中的所有循环?

Scala:继承中的构造函数顺序

scala - 类型成员的隐式转换

scala - 依赖方法类型与默认参数冲突

scala - F-bounded 类型和方法在参数和返回位置有类型参数

Scala抽象路径依赖类型问题

scala - 为什么我会从此代码中收到 MalformedInputException?

scala - 如何在Scala上执行函数式编程

Scala,使用类型级别的代数定义格

scala - 使用路径相关类型参数覆盖函数