Cześć,
Either <A, B>
Co to oznacza ? Wiem, że to ze scali, ale używam tego w JAVIE. Do czego to służy, jak działa ?
Cześć,
Either <A, B>
Co to oznacza ? Wiem, że to ze scali, ale używam tego w JAVIE. Do czego to służy, jak działa ?
Either ma dwie implementacje: Left i Right. Każda z nich zawiera jedną wartość. Dzięki temu masz pewność, że w Either jest dokładnie jedna wartość - albo typu A, albo typu B.
Do czego służy? Np do zwracania błędów bez użycia wyjątków. Wtedy używasz typu Either<TypBazowyBłędu, TypBazowyWyniku>
jako typu zwracanego z funkcji.
Ok, faktycznie to tak jest.
tzn chodzi mi o to:
Prawda, sporo upraszcza, ale ale:
nie mamy po prostu rzucenia wyjątku, musimy ifować. czy left, czy right.
W Scali sprawdza się dobrze. Jest sobie metoda fold i można jej użyć w ten sposób:
cośCoZwracaEither.fold(zróbCośZLewym, zróbCośZPrawym)
Ewentualnie można zrobić tak:
object EitherMonad {
def main(args: Array[String]) {
implicit def rightLeaningEither[A, B](either: Either[A, B]): RightProjection[A, B] = either.right
val r = for {
a <- Right('c')
b <- Left(5)
c <- Right('a')
} yield c
println(r)
}
}
Jak w Javie się używa Either i jakie ma możliwości to nie wiem, bo to zależy skąd bierzesz te Either, ale ogólnie Either jest idiomem w programowaniu funkcyjnym, gdzie unika się wyjątków, bo łamią referential transparency
.
Używając Either możesz ustrukturyzować kod inaczej niż gdybyś korzystał z try/ catch. Np:
val r1 = for {
a <- zdobądźWartość
b <- cośPolicz(a)
} yield b
val r2 = for {
a <- skombinujWInnySposóbJeśliTrzeba(r1)
b <- cośTamJeszczePolicz(a)
} yield b
Tutaj dzieją się następujące rzeczy:
zdobądźWartość
to wykonujemy na wyniku cośPolicz
,skombinujWInnySposóbJeśliTrzeba
- na niej już nie robimy cośPolicz
,cośTamJeszczePolic
,Jest późno, więc gorzej myślę, ale i tak wydaje mi się, że takie coś jest dużo czytelniejsze niż żonglowanie blokami try/ catch.