【问题标题】:HList(DValue[A], DValue[B]) to HList(A, B) at library level?库级别的 HList(DValue[A], DValue[B]) 到 HList(A, B)?
【发布时间】:2022-06-15 20:24:14
【问题描述】:

我正在构建一个数据绑定库,它有 3 个基本类

trait DValue[+T] {
  def get:T
}
class DField[T] extends DValue[T] {
  // allow writes + notifying observers
}
class DFunction[T](deps:DValue[_]*)(compute :=> T) extends DValue[T] {
  def get = compute // internally compute will use values in deps
}

但是,在这种方法中,DFunction 的定义不是很可靠 - 它要求 DFunction 的用户确保将计算中使用的所有 DValue 都放入“deps”列表中。所以我希望用户能够做这样的事情:

val dvCount:DValue[Int] = DField(3)
val dvElement:DValue[String] = DField("Hello")
val myFunction = DFunction(dvCount, dvElement) { (count, element) => // compiler knows their type
  Range(count).map(_ => element).toSeq
}

正如您在构建“myFunction”时所看到的,所引用的字段和用法已清晰映射。 我觉得也许 HList 可以让我在库级别提供一些允许这样做的东西,但我不知道如何使用 HList 实现这一点?或者还有什么可以帮助实现这一目标的?

【问题讨论】:

    标签: scala shapeless scala-cats


    【解决方案1】:

    shapeless.ops.hlist.Mapper 允许您使用 Poly 函数执行此操作。

    不幸的是,它的文档不是很好;您可能需要进行一些源码潜水以了解如何使用它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-27
      • 2021-11-28
      • 2017-04-06
      • 2014-03-29
      • 2012-06-26
      相关资源
      最近更新 更多