【问题标题】:How combine 2 shapeless functions (replaceAt and at) easiest way?如何结合 2 个无形函数(replaceAt 和 at)最简单的方法?
【发布时间】:2017-10-31 07:57:07
【问题描述】:

也许有人可以帮助我解决无形的问题?我是新手。

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

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, ()=&gt; t.at(1)),但我非常不想使用第三个参数

所以,总的来说我的问题是:

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

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

【问题讨论】:

    标签: scala shapeless


    【解决方案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))
    

    【讨论】:

    • 谢谢!这似乎是我需要的。我在使用ModifierAt 时遇到了麻烦,但我使用了updateAtWith(),它正在使用它。现在一切正常:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-25
    • 2021-08-13
    • 1970-01-01
    • 2015-06-27
    • 2021-12-13
    • 2021-10-01
    • 2017-02-02
    相关资源
    最近更新 更多