我有一些基于shapeless HLists的类型:
type t1 = Int :: String :: Int :: HNil
type t2 = String :: String :: Int :: HNil
我希望定义一个密封特质ST
,它是所有类型的超类型,这样,如果我有以下函数:
def fun(x:ST) = …
以下是有效的:
fun(5 :: "foo" :: 3 :: HNil) // It is a t1
fun("foo" :: "bar" :: 42 :: HNil) // It is a t2
但以下代码无法编译:
fun(5 :: 3 :: HNil)
我该如何定义
t1
和t2
作为ST
的子类型?
更新
我认为余积可能是一个解决方案。type ST = t1 :+: t2 :+: CNil
fun(Coproduct[ST](5 :: "foo" :: 3 :: HNil)) // compiles
fun(Coproduct[ST](5 :: 3 :: HNil)) // does not compile
def fun[A <: HList](x:A)(implicit funnable:Funnable[A]) = x
,以保留x
的一些类型信息。 - EduardoHList
约束(这取决于您如何使用它是否有意义)。 - Travis Brownx
是HList。最终,我保留了两个约束条件。 - Eduardo