Вот код, который у меня есть:
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
для этого. Есть идеи?