scala - Scala 的路径依赖类型是什么意思?

标签 scala type-systems path-dependent-type

我听说 Scala 有路径依赖类型。这与内部类有关,但这实际上意味着什么以及我为什么关心?

最佳答案

我最喜欢的例子:

case class Board(length: Int, height: Int) {
  case class Coordinate(x: Int, y: Int) { 
    require(0 <= x && x < length && 0 <= y && y < height) 
  }
  val occupied = scala.collection.mutable.Set[Coordinate]()
}

val b1 = Board(20, 20)
val b2 = Board(30, 30)
val c1 = b1.Coordinate(15, 15)
val c2 = b2.Coordinate(25, 25)
b1.occupied += c1
b2.occupied += c2
// Next line doesn't compile
b1.occupied += c2

因此,坐标 的类型取决于实例化它的Board 实例。可以用它来完成各种各样的事情,提供一种依赖于值而不是仅依赖于类型的类型安全性。

这可能听起来像依赖类型,但它的局限性更大。例如,占用的类型取决于Board的值。上面,最后一行不起作用,因为 c2 的类型是 b2.Cooperative,而 占用 的类型是 Set [b1.坐标]。请注意,可以使用具有相同类型 b1 的另一个标识符,因此它不是与该类型关联的标识符 b1。例如,以下作品:

val b3: b1.type = b1
val c3 = b3.Coordinate(10, 10)
b1.occupied += c3

关于scala - Scala 的路径依赖类型是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2693067/

相关文章:

scala - Play Framework 通过 rabbitmq 发送消息

scala - 使用路径相关类型参数覆盖函数

scala - 路径依赖类型是子类型吗?

java - Scala 中的新 Java 类 : takes type paremeters

scala - 向部分函数添加新参数

haskell - 你在 Haskell 中发现了更高级别的类型有什么用途?

c# - 如何解决 C# 中的 N 级多态性?

haskell - 我想编写一个类似于Haskell中的`flip`的函数来摆脱lambda表达式。但我不能处理它的类型

scala - 路径依赖类型和嵌套特征

scala - 不太理解 `F(1A) = 1F(A) ∀ A ∈ C1` 作为 Functor law