gpt4 book ai didi

scala - 带有无形的类型转换

转载 作者:行者123 更新时间:2023-12-04 14:10:44 25 4
gpt4 key购买 nike

我有一个类似的类(class):

class MyClass[T <: HList] {
val x: ???
}

我的问题是 x 的类型瓦尔我想要的是让它成为每个类型的 HList UT HList 替换为 Option[U] . IE。如果我指定:
new MyClass[Int :: String :: HNil]

我要 x类型为 Option[Int] :: Option[String] :: HNil
这甚至可能吗?怎么做?

最佳答案

您需要一个 Mapped见证T的实例和 x 的类型有这样的关系:

import shapeless._, ops.hlist.Mapped

abstract class MyClass[T <: HList, OT <: HList](implicit
mapped: Mapped.Aux[T, Option, OT]
) {
val x: OT
}

不幸的是,这有点不方便实例化:
new MyClass[Int :: String :: HNil, Option[Int] :: Option[String] :: HNil] {
val x = Some(0) :: Some("") :: HNil
}

有一些方法可以解决这个问题,但它们需要一些额外的更改。例如,您可以允许推断两个类型参数:
import shapeless._, ops.hlist.Comapped

class MyClass[T <: HList, OT <: HList](val x: OT)(implicit
mapped: Comapped.Aux[OT, Option, T]
)

进而:
new MyClass(Option(0) :: Option("") :: HNil)

或者您可以使用更接近原始类的东西,并在伴随对象中使用自定义构造函数:
import shapeless._, ops.hlist.Mapped

abstract class MyClass[T <: HList] {
type OT <: HList
def mapped: Mapped.Aux[T, Option, OT]
val x: OT
}

object MyClass {
class PartiallyApplied[T <: HList] {
def apply[OT0 <: HList](x0: OT0)(implicit
mapped0: Mapped.Aux[T, Option, OT0]
): MyClass[T] =
new MyClass[T] {
type OT = OT0
val mapped: Mapped.Aux[T, Option, OT] = mapped0
val x: OT = x0
}
}

def apply[T <: HList]: PartiallyApplied[T] = new PartiallyApplied[T]
}

进而:
MyClass[Int :: String :: HNil](Option(0) :: Option("") :: HNil)

哪种方法更合适取决于您如何使用该类。

关于scala - 带有无形的类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35045009/

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