HList(DValue[A], DValue[B]) to HList(A, B) at library level?



我正在构建一个数据绑定库,它有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实现这一点?或者有其他东西可以帮助实现这个目标?

shapeless.ops.hlist.Mapper允许您使用Poly函数来完成此操作。

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

最新更新