scala - 类型参数声明中的无形解构元组

标签 scala implicit shapeless

我正在使用返回 Tuple2 的 RightFolder 并希望返回 _1 部分。第一个版本 rightFoldUntupled1 工作正常,但使用了额外的 IsComposite 类型类。

在第二个版本 rightFoldUntupled2 中,我尝试在没有 IsComposite 的情况下通过将 P 解构为 Product2[_, Values ]。这不再有效 - 编译器很高兴看到 P 是一个 Product2[_,_],但是一旦我为 _1 使用命名类型参数> 它不再编译。知道为什么吗?

完整的源代码(sbt 准备好运行隐式调试输出)在这里:https://github.com/mpollmeier/shapeless-playground/tree/f3cf049

case class Label[A](name: String)

val label1 = Label[Int]("a")
val labels = label1 :: HNil

object getValue extends Poly2 {
  implicit def atLabel[A, B <: HList] = at[Label[A], (B, Map[String, Any])] {
    case (label, (acc, values)) ⇒
      (values(label.name).asInstanceOf[A] :: acc, values)
  }
}

// compiles fine
val untupled1: Int :: HNil = rightFoldUntupled1(labels)

// [error] could not find implicit value for parameter folder:
// shapeless.ops.hlist.RightFolder.Aux[shapeless.::[Main.DestructureTupleTest.Label[Int],shapeless.HNil],
//(shapeless.HNil, Map[String,Any]),Main.DestructureTupleTest.getValue.type,P]
val untupled2: Int :: HNil = rightFoldUntupled2(labels)

def rightFoldUntupled1[L <: HList, P <: Product2[_, _], Values <: HList](labels: L)(
  implicit folder: RightFolder.Aux[L, (HNil, Map[String, Any]), getValue.type, P],
  ic: IsComposite.Aux[P, Values, _]
): Values = {
  val state = Map("a" -> 5, "b" -> "five")
  val resultTuple = labels.foldRight((HNil: HNil, state))(getValue)
  ic.head(resultTuple)
}

def rightFoldUntupled2[L <: HList, Values, P <: Product2[_, Values]](labels: L)(
  implicit folder: RightFolder.Aux[L, (HNil, Map[String, Any]), getValue.type, P]
): Values = {
  val state = Map("a" -> 5, "b" -> "five")
  val resultTuple = labels.foldRight((HNil: HNil, state))(getValue)
  resultTuple._1
}

最佳答案

这应该与 rightFoldUntupled1 相同:

def rightFoldUntupled2[L <: HList, Values, M](labels: L)(
  implicit folder: RightFolder.Aux[L, (HNil, Map[String, Any]), getValue.type, (Values, M)]
  ): Values = {
  val state = Map("a" -> 5, "b" -> "five")
  val resultTuple = labels.foldRight((HNil: HNil, state))(getValue)
  resultTuple._1
}

关于scala - 类型参数声明中的无形解构元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33313164/

相关文章:

scala - Play 模板仅在使用括号调用时有效

scala - 如何查明我正在使用哪个 Play 版本?

scala - Apache Spark K-Means 集群 - 用于输入的 RDD

scala - 覆盖两个 mixin 交集中的特征函数

scala - 模式匹配中的隐式

scala - 开始使用 Lift 的最佳方式是什么?

Scala:为什么在函数参数上使用隐式?

scala - 在 Shapeless 中,给定两条记录,我如何要求两条记录具有相同的键并将它们连接起来?

Scala:基于类型的列表分区

scala - 在 Scalaz 状态单子(monad)中查找 Shapeless HList 的类型类实例