在HList类型级映射

问题描述 投票:3回答:1

我手卷我的数据库API和将基本上喜欢列族建模为列的HList,后者松散是一个Seq[_],所以地方我有一个像类型Column[String]::Column[Int]::Column[Double]::HNil,以共享一个共同的类型构造的所有元素。

什么是表达行,即String::Int::Double::HNil类型的最简单的方法,从类型上面给出的,本质上展开内部类型?我当前的理由是,因为不成形可以做一个地图上给予正确的HListpoly,应该能(AB)使用Out性状的depedent类型Mapper

有一件事我能想到的只是实现与正确的情况下,没用poly,像Case.Aux[Column[T],T]所有Ts然后召唤Mapper吧等瞧,有我有我的Out,但这种感觉有点哈克,我不知道它甚至会工作。在另一方面,我还不觉得舒服各地依赖类型和类型递归真的想尝试并实现其无形显然已经做了。

谢谢你的任何输入!

scala mapping shapeless type-level-computation hlist
1个回答
3
投票

尝试

import shapeless.PolyDefns.~>
import shapeless.ops.hlist.{Comapped, NatTRel}
import shapeless.{HList, HNil, Id}

object App {
  case class Column[A](a: A)

  def extract[L <: HList, L1 <: HList](l: L)(implicit
    comapped: Comapped.Aux[L, Column, L1],
    natTRel: NatTRel[L, Column, L1, Id],
  ): L1 = natTRel.map(new (Column ~> Id) { def apply[T](col: Column[T]) = col.a }, l)

  val result = extract(Column(1) :: Column("a") :: HNil)

  def main(args: Array[String]): Unit = {
    println(result) // 1 :: a :: HNil
  }
}

要么

import shapeless.PolyDefns.~>
import shapeless.ops.hlist.NatTRel
import shapeless.{HList, HNil}

object App {
  case class Column[A](a: Seq[A])

  def extract[L <: HList, L1 <: HList](l: L)(implicit
    natTRel: NatTRel[L, Column, L1, Seq],
  ): L1 = natTRel.map(new (Column ~> Seq) { def apply[T](col: Column[T]): Seq[T] = col.a }, l)

  val result = extract(Column(Seq("a", "b")) :: Column(Seq(1, 2)) :: Column(Seq(10.0, 20.0)) :: HNil)

  def main(args: Array[String]): Unit = {
    println(result) // List(a, b) :: List(1, 2) :: List(10.0, 20.0) :: HNil
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.