scala - 使用静态 Nat HList 压缩通用 HList

标签 scala typeclass shapeless

我正在寻找一种将两个 HList 压缩在一起的方法。第一个是从以其通用表示形式转换的案例类生成的,第二个是手动定义为 Nat 的 HList。

因此,我期望一个元组(或 2 成员 HList)包含案例类中的一个字段,以及关联的 Nat。

目标是创建一个“可定制的”ZipWithIndex .

def derive[A, I <: HList, R <: HList, Z <: HList](implicit 
  gen: Generic.Aux[A, R],
  zipper: Zip.Aux[R, I, Z],
  enc: Lazy[Encoder[Z]])(a: A): Deriver[A] = {
    val genRepr = gen.to(A)
    val zipped = zip(genRepr :: ??? :: HNil)
    enc.value(zipped)
}

case class Foo(a: String, b: String, c: String)
derive[Foo, Nat._1 :: Nat._3 :: Nat.7 :: HNil]

结果必须匹配 encoderTuple[H, N <: Nat, T <: HList]: Encoder[(H, N) :: T]或者和 encoderHList[H, N <: Nat, T <: HList]: Encoder[(H::N::HNil) :: T] .

最佳答案

The goal is to create a "customizable" ZipWithIndex.

我想标准的 shapeless.ops.hlist.Zip 应该足够了:

  trait Encoder[Z] {
    type Out
    def apply(z: Z): Out
  }

  object Encoder {
    type Aux[Z, Out0] = Encoder[Z] { type Out = Out0 }

    // implicits
  }

  trait Deriver[A]

  object Deriver {
    // implicits
  }

  def derive[A, I <: HList, R <: HList, Z <: HList](a: A, i: I)(implicit
                                                    gen: Generic.Aux[A, R],
                                                    zipper: Zip.Aux[R :: I :: HNil, Z],
                                                    enc: Lazy[Encoder.Aux[Z, Deriver[A]]]): Deriver[A] = {
    val genRepr: R = gen.to(a)
    val zipped: Z = zipper(genRepr :: i :: HNil)
    enc.value(zipped)
  }

  case class Foo(a: String, b: String, c: String)
//  derive[Foo, Nat._1 :: Nat._3 :: Nat._7 :: HNil, ???, ???]
  derive(Foo("aaa", "bbb", "ccc"), Nat._1 :: Nat._3 :: Nat._7 :: HNil)

关于scala - 使用静态 Nat HList 压缩通用 HList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45447517/

相关文章:

java - 将带有通配符的方法重写从 Java 转换为 Scala

haskell - 使用 GADT 为类型类构造具体类型

haskell - 错误类型类的使用

scala - 有没有办法使用对象的类型作为类型参数的参数?

scala - Shapeless 中 Nat 类型的限制

scala - 什么是“?”符号(问号)在Scala中意味着什么?

algorithm - 计算两个日期之间的工作日数的最快算法?

scala - 如何从具有特定(参数化)类型的 HList 中提取元素

scala - SBT 不会解决对除 Typesafe 之外的任何存储库的传递依赖

haskell - 这个仿函数式标签的类型类的名称是什么?