Распаковать значение из Either <L, R> vavr - PullRequest
0 голосов
/ 11 января 2019

Фон

У меня есть небольшая функция, которая может вернуть 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.

Вопрос

Как получить доступ к реальному значению, хранящемуся в любой монаде?

1 Ответ

0 голосов
/ 11 января 2019

Используйте flatMap(either_double) вместо map(either_double).

...