在 scala shapeless 中,如何在另一个方法中使用 Record.updateWith?
In scala shapeless, how to use Record.updateWith inside another method?
根据我在网上阅读的内容,无形 Record.updateWith 似乎是更新记录条目的值和类型的唯一方法。所以我试了一下:
import shapeless.syntax.singleton.mkSingletonOps
import shapeless.record._
val existing = ("i" ->> 3.0) :: ("j" ->> "Abc") :: HNil
val uu = existing.updateWith("i")(_ => 123)
成功了!输出是 123 :: Abc :: HNil
,但是我遇到了一个不同的问题:我不能在另一个函数中调用这个函数,即它不能在范围内使用 typeclasses:
def update[HH <: HList, O](existing: HH, k: Witness.Lt[String], v: Int)(
implicit
lemma1: Selector.Aux[HH, k.T, O],
lemma2: Modifier[HH, k.T, O, Int]
) = {
val result = existing.updateWith(k.value)(_ => v)
result
}
最新的编译器(2.13.4)报错信息如下:
[Error] ... : Unable to resolve implicit value of type shapeless.ops.record.Selector[HH,Witness.this.value.type]
one error found
尽管 lemma1
完全符合这个条件。所以我的问题是:
如何让updateWith
的class型召唤师使用lemma1
? (用宏写的)
如果这不可能,我还有哪些其他选择可以在方法中实现正确的更新?
非常感谢您的帮助
Despite that lemma1 totally qualifies this condition.
不,不是。 Selector[HH, k.T]
和 Selector[HH, k.value.type]
是不同的类型。 k.value.type
是 k.T
的子类型。 Selector
不变。
我已经 你使用类型 类 而不是扩展方法
def update[HH <: HList, O](existing: HH, k: Witness.Lt[String], v: Int)(
implicit
lemma1: Selector.Aux[HH, k.T, O],
lemma2: Modifier[HH, k.T, O, Int]
) = {
lemma2(existing, _ => v)
}
或
def update[HH <: HList, K <: String, O](existing: HH, k: K, v: Int)(
implicit
witness: Witness.Aux[K],
lemma1: Selector.Aux[HH, K, O],
lemma2: Modifier[HH, K, O, Int]
) = {
lemma2(existing, _ => v)
}
根据我在网上阅读的内容,无形 Record.updateWith 似乎是更新记录条目的值和类型的唯一方法。所以我试了一下:
import shapeless.syntax.singleton.mkSingletonOps
import shapeless.record._
val existing = ("i" ->> 3.0) :: ("j" ->> "Abc") :: HNil
val uu = existing.updateWith("i")(_ => 123)
成功了!输出是 123 :: Abc :: HNil
,但是我遇到了一个不同的问题:我不能在另一个函数中调用这个函数,即它不能在范围内使用 typeclasses:
def update[HH <: HList, O](existing: HH, k: Witness.Lt[String], v: Int)(
implicit
lemma1: Selector.Aux[HH, k.T, O],
lemma2: Modifier[HH, k.T, O, Int]
) = {
val result = existing.updateWith(k.value)(_ => v)
result
}
最新的编译器(2.13.4)报错信息如下:
[Error] ... : Unable to resolve implicit value of type shapeless.ops.record.Selector[HH,Witness.this.value.type]
one error found
尽管 lemma1
完全符合这个条件。所以我的问题是:
如何让
updateWith
的class型召唤师使用lemma1
? (用宏写的)如果这不可能,我还有哪些其他选择可以在方法中实现正确的更新?
非常感谢您的帮助
Despite that lemma1 totally qualifies this condition.
不,不是。 Selector[HH, k.T]
和 Selector[HH, k.value.type]
是不同的类型。 k.value.type
是 k.T
的子类型。 Selector
不变。
我已经
def update[HH <: HList, O](existing: HH, k: Witness.Lt[String], v: Int)(
implicit
lemma1: Selector.Aux[HH, k.T, O],
lemma2: Modifier[HH, k.T, O, Int]
) = {
lemma2(existing, _ => v)
}
或
def update[HH <: HList, K <: String, O](existing: HH, k: K, v: Int)(
implicit
witness: Witness.Aux[K],
lemma1: Selector.Aux[HH, K, O],
lemma2: Modifier[HH, K, O, Int]
) = {
lemma2(existing, _ => v)
}