Scala在函数类型签名中使用依赖类型?

Dan*_*hin 1 scala

我不确定问题标题的措辞是否恰当,所以我会详细说明.

sealed trait RedisKey[A] {
  type valueType = A
  def name: String
}
case object FirstName extends RedisKey[String] { val name = "first_name" }
case object Age extends RedisKey[Int] { val name = "age" }

trait Redis {
  def fetch(key: RedisKey)// : key.valueType
}
Run Code Online (Sandbox Code Playgroud)

我需要限制的返回类型fetchRedisKey依赖型 valueType(不知道这是正确的术语).但很明显,上面不会工作,因为我需要一个具体的实例,RedisKey然后才能访问它的依赖类型.

是否有可能以任何方式实现这一目标?

pla*_*ler 6

你也可以使用依赖类型:

sealed trait RedisKey {
  type valueType
  def name: String
}
case object FirstName extends RedisKey { type valueType = String; val name = "first_name" }
case object Age extends RedisKey { type valueType = Int;  val name = "age" }

trait Redis {
  def fetch(key: RedisKey): key.valueType
}
(null: Redis).fetch(Age): Int
(null: Redis).fetch(FirstName): String
Run Code Online (Sandbox Code Playgroud)

最后两行用于测试repl中方法的返回类型.