2017-10-29 3 views
0

Vielleicht kann mir jemand mit formlos helfen? Ich bin neu damit.Wie kombinieren 2 formlose Funktionen (replaceAt und at) einfachste Weg?

Meine konkrete Aufgabe - Funktion erstellen, die Tupelelement in Option Zum Beispiel gegeben konvertieren:

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

Wenn Rückkehr: ("zzz", Option(5))

fand ich, dass ich diese Aufgaben mit replaceAt und at tun kann Funktionen, aber ich kann nicht herausfinden, wie man das in einer generischen Funktion macht. Mein bestes Ergebnis ist folgendes:

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())) 
} 

So kann ich es wie opt(t, 1,()=> t.at(1)) nennen, aber ich würde sehr gerne nicht 3. param verwenden

im Allgemeinen Also, meine Frage ist:

Ich kann nicht kombinieren at() Ausgang und replaceAt() Eingang.

IDE bietet mir At[P, n.N]#Out als at() Ausgang verwenden, aber nicht dieses Spiel mit U Eingang replaceAt

Antwort

1

Versuchen 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)) 
+0

Thank you! Dies ist anscheinend das, wofür ich gebraucht wurde. Ich hatte Probleme mit 'ModifierAt', aber ich benutzte' updateAtWith() ', das es benutzte. Und jetzt funktioniert alles wie es soll :) – MercurieVV