scala/scala3

Match type syntax does not allow writing type patterns for type members directly

Open

#13,416 建立於 2021年8月29日

在 GitHub 查看
 (11 留言) (3 反應) (0 負責人)Scala (1,159 fork)batch import
area:match-typeshelp wanteditype:enhancement

倉庫指標

Star
 (6,247 star)
PR 合併指標
 (平均合併 18天 14小時) (30 天內合併 133 個 PR)

描述

Minimized code

trait RDF {
  type Triple
}
object RDF {
  type Triple[R <: RDF] = R match {
    case (RDF { type Triple = t }) => t
  }
  type GetTriple[T] = RDF { type Triple = T }
}

Output

Not found: type t

Expectation

Expected to be able to extract a variable type from inside a type refinement.

This syntax limit can be worked around by introducing a "pattern type":

trait RDF {
  type Triple
}
object RDF {
  type Triple[R <: RDF] = R match {
    case GetTriple[t] => t
  }
  type GetTriple[T] = RDF { type Triple = T }
}

Why write something like that? Apparently this pattern of extracting a field using a match type can substitute for some usages of generalized type projections and is enough to port some of the libraries using type projections, e.g. https://github.com/bblfish/banana-play

貢獻者指南