scala - 将函数的标记 HList(记录)映射到其参数类型的记录上

标签 scala shapeless

我(实际上,这一切都从我的工作示例中简化了)试图将逆变(常量返回值,多态参数类型)函数的标记 HList(记录)映射到由适当参数类型组成的记录上这些功能。 我知道 ZipApply,它似乎适用于 HList,但我特别想不考虑顺序地执行此操作,并特别使用键类型来选择要使用的函数。

这是我的代码示例,由于我无法弄清楚的原因而没有编译:

import shapeless._
import labelled._
import ops.hlist._
import ops.record.Selector
import syntax._
import syntax.singleton._
import syntax.HListOps

object POC {
  case class Foo(bar: String)
  val gen = LabelledGeneric[Foo]
  val funs = ('bar ->> { s: String => s.toUpperCase() }) :: HNil

  val poly = new Poly1 {
    implicit def apply[K, V]
    (implicit selector: Selector.Aux[funs.type, K, (V) => String]) =
      at[FieldType[K, V]] { v => selector(funs)(v) }
  }

  def run(foo: Foo)(implicit mapper: Mapper[poly.type, gen.Repr]) =
    mapper(gen to foo)

  println(run(Foo("bar")))
  // could not find implicit value for parameter mapper: shapeless.ops.hlist.Mapper[POC.<refinement>.type,POC.gen.Repr]
}

最佳答案

这里的问题是 poly 不是一个稳定的标识符,或者它不够稳定,或者类似的东西。以下将正常工作:

object poly extends Poly1 { ... }

我不确定我是否看到过比 Miles 对 this answer of mine 的评论更好的解释。 (现在四岁半)。

关于scala - 将函数的标记 HList(记录)映射到其参数类型的记录上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40577384/

相关文章:

scala - 以更实用的风格更改 if-else-construct?

scala - Scalatest 是否提供 NaN 的匹配器?

scala - scala 开发人员如何处理带有 shapeless 的 scala 代码中不正确的 IDE(Idea) 错误

scala - 创建一个不丢失类型的泛化方法

performance - 使用Scala/Akka在JVM中进行高频交易

Scala 中缀/后缀运算符

scala - 执行并获取包装在上下文中的函数的返回值?

shapeless - Functor 缺少参数实例的隐式值(仅在 sbt clean 之后)

scala - 无形:Generic.Aux

scala - Shapeless: 试图通过类型来限制 HList 元素