使用依赖类型进行向下转换?

时间:2018-11-19 21:30:52

标签: scala type-conversion shapeless dependent-type downcast

这里有我的代码:

sealed trait Section {
  val value:String
  type Out
}
case object AUTO_LOANS extends Section{ 
  val value="auto-loans"
  type Out = AUTO_LOANS.type
}
case object STUDENT extends Section{ 
  val value="student"
  type Out = STUDENT.type
}
object Section {
    def apply(s:String):Option[Section] = s match {
        case "auto-loans" => Some(AUTO_LOANS)
        case "student" => Some(STUDENT)
        case _ =>None
    }
}

sealed trait UserTypeFinder[A] {
  def user[A](facts: Set[Fact], fv: Option[FactVector]): Option[User]
}
object UserTypeFinder {
  def apply[A](implicit utf: UserTypeFinder[A]): UserTypeFinder[A]=utf
}
implicit val autoLoans = new UserTypeFinder[AUTO_LOANS.type] {
  override def user[A](facts: Set[Fact], fv: Option[FactVector]): Option[User] = { .. }
}

def findUser[A: UserTypeFinder](section: A, fs: Set[Fact], fv: Option[FactVector]): Option[User] = {
  UserTypeFinder[A].user(fs, fv)
}

现在我要做:

findUser(Section("auto-loans"),Set(),None)的类型Section("auto-loans")Section而不是AUTO_LOANS.我想保留类型以便类型类起作用。

我已经研究了无形依赖类型,因此我考虑在每个案例对象中存储类型Out(如上所示),然后将对象强制转换为Out:

val auto0=Section("auto-loans")
val v0=auto0.asInstanceOf[auto0.Out]

现在v0的类型是Out而不是AUTO_LOANS,所以这解决不了什么。

有什么想法如何保留类型或如何在编译时获取它们?我不确定是否可以使用Aux。有什么想法吗?

0 个答案:

没有答案