如何结合 2 个无形函数(replaceAt 和 at)最简单的方法?
How combine 2 shapeless functions (replaceAt and at) easiest way?
也许有人可以帮我解决 shapeless 问题?我是新手。
我的具体任务 - 创建将给定元组元素转换为选项的函数
例如:
val inp: (String, Int) = ("zzz", 5)
myfunc(inp, 1)
应该returns:("zzz", Option(5))
我发现我可以使用 replaceAt
和 at
函数完成这些任务,但我无法弄清楚如何在一个通用函数中完成这些任务。
我最好的结果是:
def opt[P <: Product, U, V, R](p: P, n: Nat, u: ()=>U)(implicit at: At[P, n.N], replacer: ReplaceAt.Aux[P, n.N, Option[U], (V, R)]):R = {
val value1: TupleOps[P] = shapeless.syntax.std.tuple.productTupleOps(p)
val out1 = value1.at(n)
value1.updatedAt(n, Option(u()))
}
所以我可以像 opt(t, 1, ()=> t.at(1))
那样称呼它,但我非常不想使用第三个参数
所以,总的来说我的问题是:
我无法合并 at()
输出和 replaceAt()
输入。
IDE 让我使用 At[P, n.N]#Out
作为 at()
输出,但这与 replaceAt
的 U
输入不匹配
尝试 ModifierAt
:
import shapeless.Nat
import shapeless.ops.tuple.{At, ModifierAt}
def myfunc[P <: Product, N <: Nat, T, P1 <: Product](p: P, n: N)(implicit
at: At.Aux[P, N, T],
modifier: ModifierAt.Aux[P, N, T, Option[T], (T, P1)]): P1 =
modifier(p, Some(_))._2
myfunc(inp, 1) //("zzz",Some(5))
也许有人可以帮我解决 shapeless 问题?我是新手。
我的具体任务 - 创建将给定元组元素转换为选项的函数 例如:
val inp: (String, Int) = ("zzz", 5)
myfunc(inp, 1)
应该returns:("zzz", Option(5))
我发现我可以使用 replaceAt
和 at
函数完成这些任务,但我无法弄清楚如何在一个通用函数中完成这些任务。
我最好的结果是:
def opt[P <: Product, U, V, R](p: P, n: Nat, u: ()=>U)(implicit at: At[P, n.N], replacer: ReplaceAt.Aux[P, n.N, Option[U], (V, R)]):R = {
val value1: TupleOps[P] = shapeless.syntax.std.tuple.productTupleOps(p)
val out1 = value1.at(n)
value1.updatedAt(n, Option(u()))
}
所以我可以像 opt(t, 1, ()=> t.at(1))
那样称呼它,但我非常不想使用第三个参数
所以,总的来说我的问题是:
我无法合并 at()
输出和 replaceAt()
输入。
IDE 让我使用 At[P, n.N]#Out
作为 at()
输出,但这与 replaceAt
U
输入不匹配
尝试 ModifierAt
:
import shapeless.Nat
import shapeless.ops.tuple.{At, ModifierAt}
def myfunc[P <: Product, N <: Nat, T, P1 <: Product](p: P, n: N)(implicit
at: At.Aux[P, N, T],
modifier: ModifierAt.Aux[P, N, T, Option[T], (T, P1)]): P1 =
modifier(p, Some(_))._2
myfunc(inp, 1) //("zzz",Some(5))