Scala,将KList的类型参数作为HList获取

标签 scala shapeless

假设我有一个任意的KList,出于参数考虑,它具有类型构造函数Option [_],即;

type Example = Option[Int] :: Option[String] :: HNil

有什么方法可以检索由类型参数组成的Hlist吗?
type Params = Int :: String :: HNil

因此,例如,我也许可以定义某种任意的getOrElse方法
getOrElse(ex:Example, default:Params):Params

现在,我正在寻找某种可能是这种形式的东西(或与我建议的类型结构类似的东西不可行)。
case class MyOptionList[L <: HList](maybes:L) {
  type Concrete = {somehow the hlist params types as an Hlist}
  def getOrElse(default:Concrete):Concrete = ???

}

最佳答案

我不是Miles,但是可以通过Shapeless的Comapped优雅地完成您要尝试做的事情:

import shapeless._, ops.hlist.Comapped

case class MyOptionList[L <: HList, C <: HList](maybes: L)(
  implicit val comapped: Comapped.Aux[L, Option, C]
) {
  def getOrElse(default: C): C = default // Not a useful implementation
}

然后:
scala> val x: Int :: HNil = MyOptionList(Option(1) :: HNil).getOrElse(2 :: HNil)
x: shapeless.::[Int,shapeless.HNil] = 2 :: HNil

请注意,在某些情况下,将约束放在方法上会更方便:
case class MyOptionList[L <: HList](maybes: L) {
  def getOrElse[C <: HList: ({ type l[x] = Comapped.Aux[L, Option, x] })#l](
    default: C
  ): C = default
}

这里的用法是相同的,但是case类上没有多余的type参数。如果要使用此方法,但限制MyOptionList的创建以禁止非Option成员,则可以在其类型参数列表中使用L <: HList: *->*[Option]#λ

关于Scala,将KList的类型参数作为HList获取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27690254/

相关文章:

Scala - 避免过于复杂的嵌套模式匹配

scala 中的 Java 类类型不匹配?

list - 总结 Scala 中的选项列表

scala - 变换/遍历 Shapeless 的 HMap

scala - Shapeless:元组上的 flatMap 无法编译

scala - `T {}` 在 Scala 中做什么

java - 将 Akka Iterable 转换为 java.lang.Iterable?

mysql - MySql 对 Slick Json 列的支持

基于 Scala 类型的属性提取器 - Getter only Lens?