Вы не можете легко получить некоторые 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*
) требуется один и тот же левый тип, но может быть другой правый тип.