所以我想在HList
上创建一个映射函数,但我需要检查应用函数内部的一些条件。Smth样:
object test extends Poly1 {
implicit def default[L <: HList](implicit head: ops.hlist.IsHCons[L]) =
at[L](t => {
if(true) t.head else false //here some condition
})
}
结果,我们丢失了关于t.head
元素的type
的所有信息;顺便说一句,如果我们构建"干净"功能:
object test extends Poly1 {
implicit def default[L <: HList](implicit head: ops.hlist.IsHCons[L]) =
at[L](t => t.head)
}
然后,很明显,一切都好。
所以问题是:如何处理它,并实现这样的功能(如果可能的话),或者我应该寻找另一种方式?为什么这里可以打字擦除?
问题不在于类型擦除或Shapeless的任何棘手之处——只是条件表达式的推断类型是两个分支类型的最小上界,在这种情况下是Any
。你可以看到同样的事情发生在一个简单的老式多态方法上:
scala> def foo[A](a: A) = if (true) a else false
foo: [A](a: A)Any
附带说明一下,在HList
的结构上进行匹配,而不是需要IsHCons
类型类的实例:,会更优雅一些(而且更惯用)
object test extends Poly1 {
implicit def default[H, T <: HList] = at[H :: T](_.head)
}
这与您的"干净"示例完全相同。