如何在Scala中获取类型构造函数的参数?

时间:2017-10-10 14:23:19

标签: scala

我正在寻找一种“放松”类型别名的方法。

在以下示例中,只有“O”在第二个type别名行中定义了类型别名。

type CodebookDetails = List[(String, List[String])]
type O[I] = CodebookDetails
requestDecodeIterable[I, O](request)

是否可以以类似的方式获取I,还是只需复制和粘贴这样的类型?:

requestDecodeIterable[(String, List[String]), List](request)

1 个答案:

答案 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