gpt4 book ai didi

scala - 什么时候空的 HList 不是 HList?

转载 作者:行者123 更新时间:2023-12-04 22:19:08 24 4
gpt4 key购买 nike

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

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

因为 HNil 对象扩展了扩展 HList 的 HNil 特性?

在返回一些 HList 的 trait 中定义方法的正确方法是什么,该方法仅由扩展类实现?

我想做如下事情:
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
}

最佳答案

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

定义像

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

应该读作

for any type H, subtype of HList there is a way to construct it's member and it will be HNil



这显然是错误的

正如我所认为的,你正在尝试做的事情是它的改写版本

there is a type H, subtype of HList and a way to construct it's member



如果是这样,您可以像这样使用类型成员:
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.typeHNil 子类型,可以 lead the compiler wrong way sometimes

关于scala - 什么时候空的 HList 不是 HList?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41010931/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com