Bifunctor[A,A]
bfのインスタンス、関数f : A => A
、Boolean
値がある場合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
述語がtrueの場合、falseの場合は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)
(より一般的なものではなく)タプルを使用したいので、次のように矢印
Bifunctor
を使用できるようです。
def calc[A](p: Boolean, bf: (A, A), f: A => A): (A, A)
= (if (p) f.first[A] else f.second[A]) apply bf