Scala 3 Типа совпадений и F-ограниченные типы: «Не может доказать»

#scala #type-level-computation #scala-3 #match-types

Вопрос:

Дано:

 abstract class Quantity[A <: Quantity[A]]
sealed trait UnitOfMeasure[A]

class Time extends Quantity[Time]
object Minutes extends UnitOfMeasure[Time]

class PowerRamp extends Quantity[PowerRamp]
object KilowattsPerHour extends UnitOfMeasure[PowerRamp]
  
type Test[X <: UnitOfMeasure[?]] = X match
  case UnitOfMeasure[t] => t
 

Следующие компиляции:

 summon[Test[Minutes.type] =:= Time]
summon[Test[KilowattsPerHour.type] =:= PowerRamp]
 

Однако, если признак UnitOfMeasure объявлен:

 sealed trait UnitOfMeasure[A <: Quantity[A]]
 

Оба вызова терпят неудачу с:

 Cannot prove that Test[Minutes.type] =:= Time.

Note: a match type could not be fully reduced:
  trying to reduce Test[Minutes.type]
  failed since selector Minutes.type
  matches none of the cases
    case UnitOfMeasure[t] => t
 

Что я делаю не так?

Скасти линк

Комментарии:

1. В этом Scastie компилятор утверждает, что он не может отображаться как совпадающий или несвязанный UnitOfMeasure[t] , что странно.

2. Удаление sealed из UnitOfMeasure не имеет никакого значения.