Фон
У меня есть небольшая функция, которая может вернуть 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 Monad, но после проверки их API для Either я не нашел способа распаковать его и получить значение как .
Я думал об использовании getOrElseGet
, но даже этот метод возвращает Right.
Вопрос
Как получить доступ к реальному значению, хранящемуся в любой монаде?