2017-10-29 6 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))처럼 호출 할 수 있습니다,하지만 매우 3 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

관련 문제