제거됨: 일반 타입 프로젝션

제거됨: 일반 타입 프로젝션 (General Type Projection)

Scala 2에서 허용되던 일반 타입 프로젝션 T#A는 Scala 3에서 사라졌어요. 무엇이 바뀌었고, 어떤 경우에 여전히 쓸 수 있는지 정리해 볼게요.

출처: Scala 3 Reference

본문

Scala 2는 T가 임의의 타입이고 AT의 타입 멤버를 가리킬 때 일반 타입 프로젝션 T#A를 허용했어요. 그런데 이건 (적어도 다른 Scala 3 기능과 결합하면) unsound한 것으로 밝혀졌어요.

이를 해결하기 위해, Scala 3는 T가 구체 타입(concrete type, 즉 추상이 아닌 모든 타입)일 때만 타입 프로젝션을 허용해요. 그런 타입의 예로는 클래스 타입(class T)이 있어요. 타입이 추상(abstract)이 되는 경우는 다음과 같아요.

  • 추상 타입 멤버(= SomeType이 없는 type T)
  • 타입 파라미터([T])
  • 추상 타입에 대한 별칭(type T = SomeAbstractType). A에는 T의 멤버 타입이어야 한다는 사실 외에 제한이 없어요. 예를 들어 하위 클래스(class T { class A })가 그렇죠.

추상 타입에 대한 타입 프로젝션을 쓰는 코드를 다시 쓰려면 경로 의존 타입(path-dependent type)이나 암시적 파라미터를 고려해 보세요.

이 제한은 조합자 계산의 타입 레벨 인코딩을 배제해요.

더 알아보기 (Learn more)