Как связать несколько Either <,>? - PullRequest
1 голос
/ 06 мая 2020

У меня есть две функции, которые возвращают Either<Error,?>, и вторая функция зависит от первой.

Either<Error, bool> either1 = ReturnEither1(...);
Either<Error, int> either2 = either1.Bind(ReturnEither2);

Теперь у меня есть 3-я функция, которая зависит от either1 и either2 и его тип left тоже Error. Как я могу сделать что-то вроде ниже?


Either<Error, MyType> either3 = [either1, either2].BindAll(...);

Итак, я хочу, чтобы either3 привязался к right как either1, так и either2.

1 Ответ

1 голос
/ 06 мая 2020

Вы не можете легко получить некоторые BindAll, потому что вы потеряете безопасность типов (MyType по сравнению с отдельными типами возврата). Я думаю, вы могли бы создать что-то, используя Fold при перечислении функций, если вы действительно думаете, что вам что-то нужно таким образом.

Для того, что вы хотите, я предпочитаю синтаксис LINQ в C#:

var result = from x1 in ReturnEither1()
             from x2 in ReturnEither2(x1)
             from x3 in ReturnEither3(x1, x2) // you can use any of the previous results
             select x3;

Это вызовет SelectMany для типа monadi c, который равен Bind (см. Документацию LanguageExt ). Вы получите правильное значение, если каждая функция вернется вправо - в противном случае получите первое левое значение (первая ошибка).

Результат будет любого типа, как возвращаемое значение ReturnEither3. Для всех отдельных функций (ReturnEither*) требуется один и тот же левый тип, но может быть другой правый тип.

...