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

时间:2015-10-05 11:29:56

标签: 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
}

我需要通过fetch依赖类型 RedisKey约束valueType的返回类型(不确定这是否是正确的术语)。但显然,上面的内容不会起作用,因为在我可以访问其依赖类型之前我需要RedisKey的具体实例。

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

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:1)

在发布这个问题后约5分钟结束时,我意识到我正在过度思考这个问题。

以下工作没有依赖类型hackery。

sealed trait RedisKey[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[A](key: RedisKey[A]): A
}