2017-10-10 9 views
1

"unwind"タイプエイリアスを探しています。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

、 '型CodebookDetails =リスト[(文字列、リスト[文字列])] 型O [I] = CodebookDetails''' ' I'は無意味です。つまり、const関数 'f(x)= 4'に相当します。 – wheaties

+1

私はあなたが定義する必要があることを恐れています:タイプI =(String、List [String])おそらく新しい世代のスカラになるでしょう、時間があれば見てください:http://dotty.epfl.ch/docs /internals/higher-kinded-v2.html – Pavel

答えて

1

を?:ように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) 

この場合、特に推論者がそれ自体で行うことができると思うので、実際には改善はありませんが、それ以外の用途もあります。

EDIT:それを見つけました:それはUnpack1と呼ばれています。あなたの例で

関連する問題