这里有我的代码:
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
。有什么想法吗?