Фон
У меня есть небольшая функция, которая может возвращать Either<String, Float>
. В случае успеха он возвращает число с плавающей запятой, в противном случае - строку с ошибкой.
Моя цель - выполнить ряд операций в конвейере и достичь программирования, ориентированного на железную дорогу, с помощью Either.
Код
import java.util.function.Function;
import io.vavr.control.Either;
@Test
public void run(){
Function<Float, Either<String, Float>> either_double = num -> {
if(num == 4.0f)
Either.left("I don't like this number");
return Either.right(num * 2);
};
Function<Float, Float> incr = x -> x + 1.0f;
Float actual =
Either.right(2f)
.map(incr)
.map(either_double)
.get();
Float expected = 6.0f;
assertEquals(expected, actual);
}
Этот код выполняет ряд простых операций. Сначала я создаю одно из правых значений со значением 2, затем увеличиваю его и заканчиваю его удвоением. Результат этих операций - 6.
Проблема
Результат математических операций - 6.0f, но это не то, что я получаю. Вместо этого я получаю Right(6.0f)
.
Это проблема, которая препятствует компиляции кода. У меня есть значение в коробке внутри монады Either, но после проверки их API для Either Я не нашел способа распаковать его и получить значение как есть.
Я думал об использовании getOrElseGet
, но даже этот метод возвращает Right.
Вопрос
Как мне получить доступ к реальным значениям, хранящимся в монаде Either?