Scala의 경로 종속 유형은 무엇을 의미합니까?


125

Scala에는 경로 종속 유형이 있다고 들었습니다. 내부 클래스와 관련이 있지만 이것이 실제로 무엇을 의미하며 왜 내가 관심을 갖는가?


2
@Michel-PDT가 무엇 인지도 알고 있습니다. 나는 SO가 대답으로 풍부해질 수 있기를 바랐습니다!
oxbow_lakes

1
PDT에 대한 ch12를 읽은 후 간결한 답변이 있기를 바랍니다
stacker

답변:


165

내가 가장 좋아하는 예 :

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. 의 유형이 있기 때문에 위, 마지막 줄이없는 작업을 수행 c2입니다 b2.Coordinate동안 occupied의 유형입니다 Set[b1.Coordinate]. 동일한 유형의 다른 식별자를 사용할 수 있으므로 유형 과 관련된 식별자b1 가 아닙니다 . 예를 들어 다음과 같이 작동합니다. b1

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

2
답변에 +1. 마지막 문장이 혼란 스러웠습니다. '유형 단독이 아닌 값에 의존하는 유형 안전성'이라고 말씀하셨습니다. 나에게 이것은 종속 유형처럼 들리지만 경로 종속 유형은 그 자체로 값에 의존하지 않습니다. 그것도 혼란 스럽다고 생각하세요?
Matthew Farwell 2011 년

4
@Matthew 나는 당신이 말하는 것을 이해하지만 경로 종속 유형 일반적으로 종속 유형과 관련된 유연성을 제공하지 않더라도 값에 의존합니다.
Daniel C. Sobral 2011 년

1
정확히 그게 내 말입니다. 처음에는 유형이 b1 / b2가 아니라 생성자에 전달 된 값에 의존한다는 것을 읽었습니다. 나는 지금 그것을 이해하지만 그것을 얻기 위해 몇 번 읽었습니다.
Matthew Farwell 2011 년

3
가장 쉬운 설명은 경로 종속 유형은 함수가 범위에서 변수를 바인딩 할 수있는 것과 똑같은 방식으로 클로저가있는 클래스 일 뿐이라는 것입니다.
polkovnikov.ph 2014

1
그러나이 비유에는 근본적인 차이점이 하나있을 수 있습니다. 하나의 바인딩은 런타임에 발생하고 (클로저의 경우) 다른 바인딩은 컴파일 타임에 발생합니다 (경로 종속 유형의 경우).
jhegedus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.