【发布时间】:2015-07-02 07:05:32
【问题描述】:
我正在使用 Shapeless 并且有以下方法来计算两个 HList 之间的差异:
def diff[H <: HList](lst1: H, lst2:H):List[String] = (lst1, lst2) match {
case (HNil, HNil) => List()
case (h1::t1, h2::t2) if h1 != h2 => s"$h1 -> $h2" :: diff(t1, t2)
case (h1::t1, h2::t2) => diff(t1, t2)
case _ => throw new RuntimeException("something went very wrong")
}
由于该方法的两个参数都采用H,因此我希望不同类型的 HList 不会在此处编译。例如:
diff("a" :: HNil, 1 :: 2 :: HNil)
不应该编译,但可以编译,并且会产生运行时错误:java.lang.RuntimeException: something went very wrong。我可以对类型参数做些什么来使这个方法只接受具有相同类型的两个边吗?
【问题讨论】:
-
您似乎没有处理
lst1或lst2中只有一个为空的情况,这可能很好地解释了您的错误。 -
我理解错误,但我想要的是编译错误,而不是运行时错误
-
哦,我明白你想要达到的目标。不幸的是,基本的
HList特征是未参数化的,因此在您的方法调用中H只是解析为Hlist(这确实是任何Hlist的超类型,而与具体元素类型无关)。看我的回答。
标签: scala shapeless type-level-computation