【问题标题】:When is an empty HList not an HList?什么时候空的 HList 不是 HList?
【发布时间】: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
}

【问题讨论】:

标签: scala shapeless


【解决方案1】:

HNil 对象是一个HList。不过没必要H

定义类似

def someHList[H <: HList]: H = HNil

应该读作

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

这显然是错误的

我觉得你正在尝试做的事情是它的改写版本

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

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

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.type的子类型HNil,可以lead the compiler wrong way sometimes

【讨论】:

  • 有道理,绝对是我问题的答案。我现在意识到我遗漏的问题是:有没有办法推断H(在调用位置?)而不必在每个实现类中明确指定它?
  • 谢谢! +1 强调需要明确归属类型 HNil: HNil
【解决方案2】:

如果只使用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
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-18
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
相关资源
最近更新 更多