Деконструировать объединение одноэлементных типов в его составные части

#scala #types #shapeless #type-level-computation

#scala #типы #бесформенный #вычисление на уровне типа

Вопрос:

Я играю с одноэлементными типами, и на основе одного из фрагментов кода Майлза Сэбина у меня есть это:

 scala> trait Param[K] { self =>
     |   type V
     | }
defined trait Param

scala> def param[V0](key: String): Param[key.type] { type V = V0 } = new    Param[key.type] { type V = V0 }
param: [V0](key: String)Param[key.type]{type V = V0}


scala>   val r = param[Int]("q")
r: Param[String("q")]{type V = Int} = $anon$1@770c789a

scala>   val s = param[String]("s")
s: Param[String("s")]{type V = String} = $anon$1@9e77ebd
  

Пока все хорошо, но теперь скажем, что у меня есть выражение:

 scala>   val ff = if (true) {
    |     r
    |   } else {
    |     s
    |   }
ff: Param[_ >: String("q") with String("s") <: String]{type V >: Int with String} = $anon$1@770c789a
  

Глядя на тип выражения, кажется, что K и V объединены в String(«q») со String(«s») и Int со String соответственно

Это имеет смысл, но теперь мой вопрос заключается в том, возможно ли «деунифицировать» или принудить этот тип к его составляющим, то есть типам r и s выше.

Что-то вроде следующего, преобразование в кортеж:

 Param[K0 with K1] { type V: V0 with V1 } -> (Param[K0] { type V: V0}, Param[K1] { type V: V1})
  

Я ищу что-то чисто на уровне типов. Есть ли шанс, что есть механизм для деконструкции унифицированного типа?