Вызов функции на «стороне» бифунктора, зависящей от значения логического

Если у меня есть экземпляр Bifunctor [A, A] bf, функция f: A => A и Логическое значение p :

def calc[A, F[_,_]: Bifunctor](p: Boolean, bf: F[A, A], f: A => A): F[A, A] = {
  val BF = implicitly[Bifunctor[F]]
  BF.bimap(bf, (a : A) => if (p) f(a) else a, (a : A) => if (!p) f(a) else a)
}

Как бы это выразить короче (и выразительнее)? В основном я пытаюсь вызвать функцию на стороне бифунктора (например, Tuple2 ), зависящую от некоторого предиката. Если предикат истинен, я хочу сопоставить LHS и RHS, если он ложен

val t2 = (1, 2)
def add4 = (_ : Int) + 4
calc(true, t2, add4) //should be (5,2)
calc(false, t2, add4) //should be (1,6)


Учитывая, что я хочу использовать кортежи (в отличие от более общего бифунктора ), я, кажется, могу используйте стрелки следующим образом

:

def calc[A](p: Boolean, bf: (A, A), f: A => A): (A, A) 
  = (if (p) f.first[A] else f.second[A]) apply bf

8
задан oxbow_lakes 11 November 2010 в 18:15
поделиться