Как проще всего объединить 2 бесформенные функции (replaceAt и at)?

Может быть, кто-то может помочь мне с бесформенным? Я новичок в этом.

Моя конкретная задача - создать функцию, которая преобразует данный элемент кортежа в Option. Например:

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

должен вернуть: ("zzz", Option(5))

Я обнаружил, что могу выполнять эти задачи с помощью функций replaceAt и at, но не могу понять, как это сделать в одной универсальной функции. Мой лучший результат таков:

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


person MercurieVV    schedule 29.10.2017    source источник


Ответы (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))
person Dmytro Mitin    schedule 30.10.2017
comment
Благодарю вас! Кажется, это то, что мне было нужно. У меня были проблемы с ModifierAt, но я использовал updateAtWith(), который использовал его. И теперь все работает как надо :) - person MercurieVV; 31.10.2017