在poly函数scala中键入擦除



所以我想在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)
}

这与您的"干净"示例完全相同。

最新更新