Jeśli mam instancji Bifunctor[A,A]
bf, funkcja f : A => A
i wartość Boolean
p
:Wywoływanie funkcji na „stronie” o Bifunctor zależnej od wartości logicznej
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)
}
Jak mogę umieścić to bardziej zwięźle (i ekspresyjnie)? Zasadniczo próbuję wywołać funkcję na stronie bifunctor (np. Tuple2
) w zależności od niektórych predykatów. Jeżeli orzeczenie to prawda, chcę mapować LHS i RHS, czy to fałszywy
val t2 = (1, 2)
def add4 = (_ : Int) + 4
calc(true, t2, add4) //should be (5,2)
calc(false, t2, add4) //should be (1,6)
Zważywszy, że chcę użyć krotki (w przeciwieństwie do bardziej ogólnego
Bifunctor
), wydaje mi się, aby móc używać arrows następująco:
def calc[A](p: Boolean, bf: (A, A), f: A => A): (A, A)
= (if (p) f.first[A] else f.second[A]) apply bf
Problem polega na tym, że piszę to * inline * (tj. Nie chcę zadeklarować dodatkowej metody), więc nie chcę dwa razy pisać 'bf', ponieważ jest (w fakt) wynik wywołania metody. Rozwiązanie ze strzałkami, które znalazłem, działa naprawdę dobrze –
Powinienem powiedzieć, że chcę mieć dostęp tylko do 'p' raz i tak –
Dla rozwiązania haskell, czy nie musisz stosować wyników do bifunektora? Czy to jest ukryte? (Nie wiem, haskell) –