我正在寻找一种“放松”类型别名的方法。
在以下示例中,只有“O”在第二个type
别名行中定义了类型别名。
type CodebookDetails = List[(String, List[String])]
type O[I] = CodebookDetails
requestDecodeIterable[I, O](request)
是否可以以类似的方式获取I
,还是只需复制和粘贴这样的类型?:
requestDecodeIterable[(String, List[String]), List](request)
答案 0 :(得分:1)
你可以使用无形的the
宏:
// Typelevel function unapplies unary type constructors:
// F[A] => (F, A)
// I think I recall seeing it somewhere in shapeless, but I can't find it,
// so I implemented it myself
sealed trait Unapp1[T] { type F[_]; type A; implicit def eq: F[A] =:= T }
object Unapp1 {
type Aux[T0, F0[_], A0] = Unapp1[T0] { type F[X] = F0[X]; type A = A0 }
implicit def source[F0[_], A0]: Aux[F0[A0], F0, A0] = new Unapp1[F0[A0]] {
type F[X] = F0[X]
type A = A0
override def eq: F[A] =:= F0[A0] = implicitly
}
def apply[T](implicit unapp: Unapp1[T]): unapp.type = unapp
}
// the.`tpe` looks up the implicit value of type tpe and gives it a stable path
// suitable for type selection
requestDecodeIterable[the.`Unapp1[CookbookDetails]`.A, the.`Unapp1[CookbookDetails]`.F](request)
在这种情况下,它并没有真正改善,特别是因为我认为推理器可以自己做,但它可能有其他用途。
编辑:发现它:它在无形状中称为Unpack1
。