首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么时候空HList不是HList?

什么时候空HList不是HList?
EN

Stack Overflow用户
提问于 2016-12-07 06:36:21
回答 2查看 266关注 0票数 4

当我学习无形体的时候,我想知道为什么它不编译:

代码语言:javascript
复制
def someHList[H <: HList]: H = HNil

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

在返回某些HList的特征中定义一个方法的正确方法是什么,它只在扩展类中实现?

我想做以下几件事:

代码语言:javascript
复制
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作为父特性中的默认实现,可以在子类中选择性地重写它。我的例子应该是:

代码语言:javascript
复制
trait Parent {
  def someHList[H <: HList]: H = HNil
}

object Child extends Parent {
  override def someHList[H <: HList] = 1 :: "two" :: HNill
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-07 07:06:51

HNil对象是HList。但这不是必要的H

定义类似

代码语言:javascript
复制
def someHList[H <: HList]: H = HNil

应理解为

对于任何type HHList的子类型都有一种方法来构造它的成员,它将是HNil

这显然是错误的

你想要做的事情,正如我所感觉的,就是把它的措辞改为

有一个type HHList的子类型和构造它的成员的一种方法

如果是这样,您可以使用这样的类型成员:

代码语言:javascript
复制
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
}

更新

您也可以重构它,使某些类型自动推断

代码语言:javascript
复制
abstract class Parent[H <: HList](val someList: H)
object Child1 extends Parent(HNil: HNil)
object Child2 extends Parent(1 :: "two" :: HNil)

您可能会注意到,HNil的类型是手动设置的,这是因为object HNil类型是HNilHNil.type子类型,可以lead the compiler wrong way sometimes

票数 8
EN

Stack Overflow用户

发布于 2016-12-07 07:34:08

如果只使用HList作为返回类型,那么一切都很好:

代码语言:javascript
复制
trait Parent {
  def someHList: HList
}

object Child1 extends Parent {
  def someHList = HNil
}

object Child2 extends Parent {
  def someHList = 1 :: "two" :: HNil
}

或问题的更新本:

代码语言:javascript
复制
trait Parent {
  def someHList: HList = HNil
}

object Child2 extends Parent {
  override def someHList = 1 :: "two" :: HNil
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41010931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档