TGViewer
Lil Functor Lil Functor @lilfunctor · 772 subscribers
Post #247 1.48K
Поигрался с match types в Scala 3. Сильно хотел использовать их для определения зависимости возвращаемого типа функции от типа аргумента, но не прокатило. Не понравилось, что матчинг при использовании типа происходит в рантайме, поэтому можно словить исключение MatchError:

type Invert[T] = T match
case String => Int
case Int => String

def invert[T](t: T): Invert[T] =
t match
case s: String => s.length
case i: Int => i.toString

val test = invert(false) // упадёт в рантайме


Полный пример в Scastie. Для переменной test компилятор выводит тип Invert[Boolean], но не проверяет, есть ли такая ветка в определении типа. В итоге код компилируется, но падает при запуске.

Второе следствие матчинга в рантайме — потеря ленивости аргументов:

type Eval[T] = T match
case Any => "do nothing"

def eval[T](t: => T): Eval[T] =
t match
case _: Any => "do nothing"

val a = eval {
println("oooops")
42
}


Полный пример в Scastie.

Пока не понимаю, является ли матчинг в рантайме следствием фундаментальных ограничений языка. Но вообще хотелось бы иметь возможность без костылей сделать зависимую типизацию для своей функции, просто разматчив тип аргумента.

Появление summonFrom и transparent inline позволяет накостылить нечто подобное чуть менее вербозно, чем в Scala 2, но всё равно не интуитивно.

Пример на Scala 2: https://github.com/zio/zio/issues/5241

Он же на Scala 3: https://scastie.scala-lang.org/EwfBu7rcTwi6UQ11VYMwEQ

Несмотря на то, что эта штука работает, выглядит она не как нативная языковая
конструкция, а как насилие над компилятором.
More from @lilfunctor
  1. Apr 3, 2024Видео моего доклада «Как в Scala переложить JSON?» https://youtu.be/usp3Y0-VxwM?si=XwuewnR…
  2. Feb 27, 2024Как в Scala переложить JSON? В эту субботу буду выступать в Москве на Scala-митапе от Янде…
  3. Oct 22, 2023Конференция F[Scala] 🪜 Всем привет! Уже в следующую субботу в Москве пройдёт конференция…
  4. Feb 6, 2022Kit Langton, автор макроса для автовайринга ZLayer, отметился в любопытном пропозале на фо…
  5. Feb 1, 2022sbt версий 1.6.0 и 1.6.1 был с багом: при ошибке инициализации фреймворка для юнит тестов…
  6. Jan 30, 2022Uber публично задокументировал свой подход к организации микросервисов — Domain-Oriented M…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →