1. ホーム
  2. scala

[解決済み] Scalaのパス依存型とはどういう意味ですか?

2022-06-29 07:50:38

質問

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

ということで、型は Coordinate のインスタンスに依存します。 Board のインスタンスに依存しています。これによって、型だけでなく値に依存した型安全性のようなものを実現することができるのです。

これは依存する型のように聞こえるかもしれませんが、より限定的です。例えば、型が occupied の値は Board . 上記では、最後の行が機能しないのは c2b2.Coordinate であり、一方 occupied の型は Set[b1.Coordinate] . 同じ型の別の識別子を使うことができることに注意してください。 b1 であるため 識別子 b1 というように、型と関連づけられる。例えば、以下のように動作します。

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