【问题标题】:Type level mapping over a HListHList 上的类型级映射
【发布时间】:2019-02-09 15:46:09
【问题描述】:

我正在处理我的数据库 API,本质上想将列族建模为列的 HList,后者松散地是 Seq[_],所以在某个地方我有一个像 Column[String]::Column[Int]::Column[Double]::HNil 这样的类型,所有元素共享一个通用的类型构造函数。

从上面给出的类型中表达行类型的最简单方法是什么,即String::Int::Double::HNil,本质上是展开内部类型? 我目前的推理是,既然 shapeless 可以在给定正确的 poly 的情况下对 HList 进行映射,那么应该能够(ab)使用 Mapper 特征的依赖类型 Out

我能想到的一件事就是在正确的情况下实现一个无用的poly,比如为所有Ts 设置一个Case.Aux[Column[T],T],然后为它调用一个Mapper 等等,我有我的@987654333 @,但这感觉有点hacky,我不确定它是否会起作用。 另一方面,对于依赖类型和类型递归,我还没有感到很舒服,我真的想尝试实现一些无形的东西显然已经做了。

感谢您的任何意见!

【问题讨论】:

    标签: scala mapping shapeless type-level-computation hlist


    【解决方案1】:

    试试

    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
      }
    }
    

    【讨论】:

    • 非常感谢!只是为了让我了解这里发生了什么:我正在进行自然转换和转换(映射?)任何类型的构造函数(列?效果?仿函数?)我必须在帮助下使用 Identity 类型(monad?仿函数?效果?)一些隐含的暗示,一个人应该能够从文档中破译并且计算结果是正确的类型?猜猜今天开始学习一些深奥的无形魔法和其他日子一样好。
    猜你喜欢
    • 2017-02-10
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    相关资源
    最近更新 更多