#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
не имеет никакого значения.