【发布时间】:2017-04-22 00:15:56
【问题描述】:
在学习 shapeless 时,我想知道为什么这不能编译:
def someHList[H <: HList]: H = HNil
因为 HNil 对象扩展了 HNil 特性,而 HNil 特性扩展了 HList?
在返回一些 HList 的 trait 中定义方法的正确方法是什么,该 HList 仅由扩展类实现?
我想做如下的事情:
trait Parent {
def someHList[H <: HList]: H
}
object Child1 extends Parent {
def someHList[H <: HList] = HNil
}
object Child2 extends Parent {
def someHList[H <: HList] = 1 :: "two" :: HNil
}
感谢任何建议。谢谢!
编辑
当我意识到我在最初的问题中没有明确说明时,详细说明:
1.) 最好不必在每个实现类中显式指定H,而是让它被推断(在调用站点?)。
2.) 我想在父 trait 中使用 HNil 作为默认实现,可以选择在子类中覆盖它。我的例子可能应该是:
trait Parent {
def someHList[H <: HList]: H = HNil
}
object Child extends Parent {
override def someHList[H <: HList] = 1 :: "two" :: HNill
}
【问题讨论】:
-
这个问题的标题是一个糟糕的双关语/对这个经典语言谜题的引用,它在结构上相似:en.wikipedia.org/wiki/When_a_white_horse_is_not_a_horse