Scala是否在函数的类型签名中使用依赖类型?
我不确定问题标题的措辞是否恰当,因此我将详细说明Scala是否在函数的类型签名中使用依赖类型?,scala,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 f
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
}
我需要通过RedisKey的依赖类型valueType约束fetch的返回类型,但不确定这是否是正确的术语。但显然,上面的方法行不通,因为我需要一个具体的RedisKey实例才能访问它的依赖类型
有可能以任何方式实现这一点吗?在发布这个问题大约5分钟后,我意识到我想得太多了 以下内容在没有依赖类型黑客的情况下工作
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
}
在发布这个问题大约5分钟后,我意识到我想得太多了 以下内容在没有依赖类型黑客的情况下工作
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
}
您也可以使用依赖类型执行此操作:
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中方法的返回类型。您也可以使用dependent type进行测试:
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中方法的返回类型。HUH?我们可以在签名中引用一个实例?我已经证实了这是有效的,但如何?这是因为允许这一点的特质中存在依赖类型吗?你能给我一个正式的规范吗?RedisKey特性包含一个抽象类型成员valueType。fetch方法在其返回类型中使用单例类型。嗯?我们可以在签名中引用一个实例?我已经证实了这是有效的,但如何?这是因为允许这一点的特质中存在依赖类型吗?你能给我一个正式的规范吗?RedisKey特性包含一个抽象类型成员valueType。fetch方法在其返回类型中使用单例类型。