경로(path)가 아니에요

경로(path)가 아니에요 (E083: Not A Path)

안정적인 경로(stable path)가 필요한 자리에서 불변 경로가 아닌 표현식을 쓰면 이 에러가 나요. 싱글턴 타입, 타입 프로젝션, 일부 패턴 매칭 같은 곳에서 경로가 필요해요.

출처: Scala 3 Reference

본문

안정적인 경로(stable path)가 필요한 자리에 불변 경로(immutable path)가 아닌 표현식이 들어오면 이 에러가 발생해요.

불변 경로는 다음과 같아요.

  • 불변 값(val)에 대한 참조
  • this에 대한 참조
  • 불변 값으로 불변 경로를 선택(selection)한 것

경로는 싱글턴 타입, 타입 프로젝션, 그리고 일부 패턴 매칭 같은 문맥에서 필요해요.

예시 (Example)

var x = 1
def example: x.type = x

xvar이므로 x.type은 유효한 싱글턴 타입이 아니에요.

에러 (Error)

-- [E083] Type Error: example.scala:2:13 ---------------------------------------
2 |def example: x.type = x
  |             ^^^^^^
  |(x : Int) is not a valid singleton type, since it is not an immutable path
  |-----------------------------------------------------------------------------
  | Explanation (enabled by `-explain`)
  |- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  | An immutable path is
  |  - a reference to an immutable value, or
  |  - a reference to `this`, or
  |  - a selection of an immutable path with an immutable value.
   -----------------------------------------------------------------------------

해결 방법 (Solution)

안정적인 경로가 필요하다면 var 대신 val을 써요.

// Use val instead of var for stable paths
val x = 1
def example: x.type = x

또는 가변 값에 싱글턴 타입을 쓰지 않는 방법도 있어요.

// Or don't use singleton types for mutable values
var x = 1
def example: Int = x