2017-02-05 8 views
1

のHListから型を構築しますか?私はそれが任意のHListCol[_]を取ることができるようにマクロでなければならないと思う。は、このコードを考えると型クラス

+0

あなたは 'Col'の定義を自由にコントロールできますか? –

+0

はい、私は 'Col'を完全に制御しています。 – serega

答えて

1

あなたは、これが直接の外側型コンストラクタとしてColを有する素子の種類に依存していることに注意

shapeless.ops.Comappedであり

scala> import shapeless._, ops.hlist._ 
import shapeless._ 
import ops.hlist._ 

scala> Comapped[Col[String] :: Col[Int] :: HNil, Col] 
res0: shapeless.ops.hlist.Comapped[shapeless.::[Col[String],shapeless.::[Col[Int],shapeless.HNil]],Col]{type Out = shapeless.::[String,shapeless.::[Int,shapeless.HNil]]} = [email protected] 

scala> type TableDef = res0.Out 
defined type alias TableDef 

scala> val foo: TableDef = "foo" :: 23 :: HNil 
foo: TableDef = foo :: 23 :: HNil 

scala> val foo: TableDef = "foo" :: true :: HNil 
<console>:18: error: type mismatch; 
found : shapeless.::[String,shapeless.::[Boolean,shapeless.HNil]] 
required: TableDef 
    (which expands to) shapeless.::[String,shapeless.::[Int,shapeless.HNil]] 
     val foo: TableDef = "foo" :: true :: HNil 
           ^
の道のほとんどを得ることができます。 NameAgeのようなタイプを収容したい場合は、サブタイプを介して Colを隠します。これはサブタイプを考慮に入れた Comappedのバリエーションを介して可能です。

+0

「Comapped」へのポインタありがとう。 – serega

関連する問題