Использовать зависимые типы для downcasting? - PullRequest
0 голосов
/ 20 ноября 2018

Вот код, который у меня есть:

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 в каждом объекте case (как показано выше), а затем после того, как объект привел его к Out:

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

теперь тип v0 равен Out вместо AUTO_LOANS, так что это ничего не решает.

Есть идеи, как сохранить типы или как их получить во время компиляции? Я не совсем уверен, смогу ли я использовать Aux для этого. Есть идеи?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...