【问题标题】:type erasure in a poly function, scala在 poly 函数中键入擦除,scala
【发布时间】:2014-01-03 01:27:23
【问题描述】:

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

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

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

那么,显然,一切都好。

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

【问题讨论】:

    标签: scala types map shapeless hlist


    【解决方案1】:

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

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

    【讨论】:

    • 哦,我明白了,如果我这样写:at[L](if(true) t =&gt; t.head else t =&gt; false) 我会得到Any ...这又是所有函数类型的原因?嗯,就像我想的那样......谢谢关于head 用法的一个很酷的注释,顺便说一句,不传递所有其他隐式(对于地图、平面地图、差异自定义助手等......)会很酷:D
    • Ophh 我完全理解了!谢谢,现在一切都清楚了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    相关资源
    最近更新 更多