我有一些基于无形 HList 的类型:
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
?
更新
我认为 Coproducts 可能是一个解决方案
type ST = t1 :+: t2 :+: CNil
fun(Coproduct[ST](5 :: "foo" :: 3 :: HNil)) // compiles
fun(Coproduct[ST](5 :: 3 :: HNil)) // does not compile