E196: Context Bound Companion Not Value

E196: Context Bound Companion Not Value

이 에러는 같은 릴리스(Scala 3.5.0)에서 도입되면서 동시에 비활성화되었고, 실제로 배포된 Scala 3 컴파일러에서는 한 번도 발생하지 않은 에러예요.

출처: Scala 3 Reference

본문

어떤 역할이었나 (What it did)

이 에러는 컨텍스트 바운드 컴패니언(context bound companion)을 선택(selection)이 아니라 독립된 값으로 사용하려고 할 때 발생하도록 만들어졌어요.

예시 (Example)

//> using options -experimental -language:experimental.modularity -source:future

class C[Self]
class D[Self]

trait Test:
  def foo[A: {C, D}] = A
  type A: C
  val x = A
  val y: A.type = ???

에러 (Error)

-- [E196] Type Error: example.scala:7:23 --------------------------------------
7 |  def foo[A: {C, D}] = A
  |                       ^
  |                       context bound companion value A cannot be used as a value

설명 (Explanation)

컨텍스트 바운드 컴패니언은 타입 파라미터의 컨텍스트 바운드로 생성된 증인을 나타내기 위해 컴파일러가 만든 합성 심볼이에요. 예를 들어 아래 코드에서는

class Monoid:
  type Self
  def unit: Self

type A: Monoid

A는 타입으로만 선언되어 있고 값 A는 존재하지 않아요. 그래도 A.unit이라는 선택을 쓸 수 있는데, 이것은 컴파일러가 (term-)이름이 A인 컨텍스트 바운드 컴패니언 값을 만들어 주기 때문에 가능해요.

에러 E196은 컨텍스트 바운드 컴패니언을 구현하는 과정에서 커밋 becdf887a5(2024년 4월)에 도입되었어요. 하지만 3.5.0 릴리스 전에 제약이 완화되면서 에러는 비활성화되었어요.

Scala 3.5.0부터 컨텍스트 바운드 컴패니언은 더 자유롭게 사용할 수 있게 되어, 이 특정 에러는 더 이상 필요 없게 되었어요.