当我学习无形体的时候,我想知道为什么它不编译:
def someHList[H <: HList]: H = HNil既然HNil对象扩展了扩展HList的HNil特性?
在返回某些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.)我想使用HNil作为父特性中的默认实现,可以在子类中选择性地重写它。我的例子应该是:
trait Parent {
def someHList[H <: HList]: H = HNil
}
object Child extends Parent {
override def someHList[H <: HList] = 1 :: "two" :: HNill
}发布于 2016-12-07 07:06:51
HNil对象是HList。但这不是必要的H。
定义类似
def someHList[H <: HList]: H = HNil应理解为
对于任何
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
}更新
您也可以重构它,使某些类型自动推断
abstract class Parent[H <: HList](val someList: H)
object Child1 extends Parent(HNil: HNil)
object Child2 extends Parent(1 :: "two" :: HNil)您可能会注意到,HNil的类型是手动设置的,这是因为object HNil类型是HNil的HNil.type子类型,可以lead the compiler wrong way sometimes。
发布于 2016-12-07 07:34:08
如果只使用HList作为返回类型,那么一切都很好:
trait Parent {
def someHList: HList
}
object Child1 extends Parent {
def someHList = HNil
}
object Child2 extends Parent {
def someHList = 1 :: "two" :: HNil
}或问题的更新本:
trait Parent {
def someHList: HList = HNil
}
object Child2 extends Parent {
override def someHList = 1 :: "two" :: HNil
}https://stackoverflow.com/questions/41010931
复制相似问题