2

所以我想在 a 上创建一个 map 函数HList,但我需要检查应用函数中的一些条件。喜欢:

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    
    })
}

结果,我们丢失了有关元素的所有type信息t.head;顺便说一句,如果我们构建“干净”功能:

object test extends Poly1 {
    implicit def default[L <: HList](implicit head: ops.hlist.IsHCons[L]) = 
    at[L](t => t.head)
}

那么,显然,一切都好。

所以问题是:如何处理它,并制作这样的功能(如果可能的话)或者我应该寻找另一种方式?为什么这里可以进行类型擦除?

4

1 回答 1

4

问题不在于类型擦除或与 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)
}

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

于 2013-12-15T19:04:40.237 回答