Scala 3

  • 주요 컨셉 : Dependent Object Types (DOT)
  • DOT 이란 : core calculus for path-dependent types, Scala 3의 핵심 개념
  • DOTTY란?
    Scala 3의 프로젝트명이자, DOT을 지원하는 새로운 컴파일러 이름이다.
    (Scala 3 에서는 scalac 대신 dotc를 사용한다)

Path dependent types

그렇다면 path-dependent types란 무엇인가?
아래와 같은 경우, Inner 클래스는 Outer 객체에 dependent한 type이다.

case class Outer() {
  case class Inner(num: Int)
  var value: Option[Inner] = None
}

val first = Outer()
val second = Outer()
val firstInner = Some(first.Inner(1))
val secondInner = Some(second.Inner(1))

first.value = firstInner
second.value = secondInne

따라서 아래와 같은 경우, 기존에는 에러가 발생하였다.

first.value = secondInner // ERROR!

[image:2A2B5D4A-4BE8-495E-9349-74F6D10A8B14-277-0000105E85E7D07B/1CB4FB1F-C690-42C4-99C5-2EB217B83E38.png]
image.png

그래서 뭐가 바뀌나?

이제 아래와 같은 코드가 가능하다

trait Key { type Value }
trait HMap { self =>
  def get(key: Key): Option[key.Value]
  def add(key: Key)(value: key.Value) = new HMap {
    def get(k: Key) =
      // Below code is no longer an error!
      if (k == key) Some(value.asInstanceOf[k.Value])
      else self.get(k) 
  }
}
object HMap {
  def empty = new HMap { def get(k: Key) = None }
}
class Setting(val str: String) extends Key
val sort = new Setting("sort") { type Value = String }
val width = new Setting("width") { type Value = Int }

val params = HMap
  .empty
  .add(width)(120)
  .add(sort)("time")

Reference