Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala是否在函数的类型签名中使用依赖类型?_Scala - Fatal编程技术网

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方法在其返回类型中使用单例类型。