2017-10-29 22 views
0

誰かが形を変えずに私を助けることができますか?私はそれで新しいです。2つの形のない関数(replaceAtとat)をどのように組み合わせるのが最も簡単ですか?

私の具体的なタスク - たとえばオプション に与えられたタプルの要素を変換する関数を作成:

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))ようにそれを呼び出すことができますが、私は非常に第三のparamを使用しないしたい

ので、一般的には私の問題はされています

at()出力とreplaceAt()入力を組み合わせることはできません。

IDEは私がat()出力としてAt[P, n.N]#Outを使用しますが、replaceAt

答えて

1

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

ありがとうございました!これは私が必要としていたようです。私は 'ModifierAt'に問題がありましたが、私はそれを使用する' updateAtWith() 'を使用しました。そして、今はすべてがうまくいくはずです:) – MercurieVV

関連する問題