如何结合2个无形函数(replaceAt和at)最简单的方法?

时间:2017-10-29 20:22:00

标签: scala shapeless

也许有人可以帮我塑造一下吗?我是新来的。

我的具体任务 - 创建将给定元组元素转换为Option的函数 例如:

val inp: (String, Int) = ("zzz", 5)
myfunc(inp, 1)

应该返回:("zzz", Option(5))

我发现我可以使用replaceAtat函数执行这些任务,但我无法弄清楚如何在一个通用函数中执行此操作。 我最好的结果是:

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))一样调用它,但我不想使用第3个参数

所以,一般来说我的问题是:

我无法合并at()输出和replaceAt()输入。

IDE让我使用At[P, n.N]#Out作为at()输出,但这与U

replaceAt输入不匹配

1 个答案:

答案 0 :(得分:1)

尝试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))