我有一些基于无形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
的子类型?
更新
我认为Coproducts可能是一个解决方案
type ST = t1 :+: t2 :+: CNil
fun(Coproduct[ST](5 :: "foo" :: 3 :: HNil)) // compiles
fun(Coproduct[ST](5 :: 3 :: HNil)) // does not compile
答案 0 :(得分:3)
使用别名将类型“制作”为任何类型的子类型是不可能的,这只是一个新名称。虽然您可以使用副产品,但创建新类型类可能更自然:
import shapeless._
type t1 = Int :: String :: Int :: HNil
type t2 = String :: String :: Int :: HNil
trait Funnable[A]
implicit object t1Funnable extends Funnable[t1]
implicit object t2Funnable extends Funnable[t2]
def fun[A: Funnable](x: A) = x
现在要编译的行将是,而不是你要编译的行。