2

だから私は を介し​​てマップ関数を作成したかったのHListですが、適用関数内のいくつかの条件を確認する必要があります。次のようなものです:

object test extends Poly1 {
    implicit def default[L <: HList](implicit head: ops.hlist.IsHCons[L]) = 
    at[L](t => {
        if(true) t.head else false //here some condition    
    })
}

その結果、要素に関するすべての情報typeが失われます。t.headところで、「クリーン」関数を作成する場合:

object test extends Poly1 {
    implicit def default[L <: HList](implicit head: ops.hlist.IsHCons[L]) = 
    at[L](t => t.head)
}

その後、明らかに、それはすべて大丈夫です。

問題は、それをどのように処理し、そのような機能を作成するか (可能であれば)、または別の方法を検索する必要があるかどうかです。なぜここでタイプ消去ができるのですか?

4

1 に答える 1

4

問題は、型の消去や、Shapeless で行うのが難しいことではありません。条件式の推論された型が、2 つの分岐の型の最小上限であり、この場合はAny. 単純な古いポリモーフィック メソッドでも同じことが起こることがわかります。

scala> def foo[A](a: A) = if (true) a else false
foo: [A](a: A)Any

補足として、型クラスHListのインスタンスを要求する代わりに、の構造に一致させる方が、もう少しエレガント (かつ慣用的)です。IsHCons

object test extends Poly1 {
  implicit def default[H, T <: HList] = at[H :: T](_.head)
}

これは、「クリーン」な例とまったく同じことを行います。

于 2013-12-15T19:04:40.237 に答える