什么时候空HList不是HList?

Rya*_*yan 4 scala shapeless

在学习无形的同时,我想知道为什么这不能编译:

def someHList[H <: HList]: H = HNil
Run Code Online (Sandbox Code Playgroud)

既然HNil对象扩展了扩展HList的HNil特征?

在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
}
Run Code Online (Sandbox Code Playgroud)

任何建议表示赞赏.谢谢!

编辑

详细阐述,因为我意识到我在原始问题中未说明的内容:

1.)希望不必H在每个实现类中明确指定,而是推断它(在调用站点?).

2.)我想在父特征中使用HNil作为默认实现,可以选择在子类中重写.我的例子应该是:

trait Parent {
  def someHList[H <: HList]: H = HNil
}

object Child extends Parent {
  override def someHList[H <: HList] = 1 :: "two" :: HNill
}
Run Code Online (Sandbox Code Playgroud)

Odo*_*ois 8

HNil对象是一个HList.但这没有必要H.

定义如

def someHList[H <: HList]: H = HNil
Run Code Online (Sandbox Code Playgroud)

应该读作

对于任何type H,子类型HList有一种方法来构建它的成员,它将是HNil

这显然是错误的

正如我所感觉的那样,你正在尝试做的事情是它的改写版本

有一个type H,子类型HList和构造它的成员的方法

如果是这样,你可以像这样使用类型成员:

import shapeless._

trait Parent {
  type H <: HList
  def someHList: H
}

object Child1 extends Parent {
  type H = HNil
  def someHList: H = HNil
}

object Child2 extends Parent {
  type H = Int :: String :: HNil
  def someHList: H = 1 :: "two" :: HNil
}
Run Code Online (Sandbox Code Playgroud)

更新

您也可以稍微重构它以使某些类型自动推断出来

abstract class Parent[H <: HList](val someList: H)
object Child1 extends Parent(HNil: HNil)
object Child2 extends Parent(1 :: "two" :: HNil)
Run Code Online (Sandbox Code Playgroud)

您可能会注意到类型for HNil是手动设置的,这是因为type object HNilHNil.type子类型HNil,有时会导致编译器错误