如何绑定多个Either<,>?

How to bind on multiple Either<,>?

我有两个函数 return Either<Error,?>,第二个函数依赖于第一个函数。

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

现在,我有第三个函数,它依赖于 either1either2,它的 left 类型也是 Error。我怎样才能做类似下面的事情?


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

所以我希望either3绑定到either1either2

您不能轻易拥有某些 BindAll,因为您会失去类型安全性(MyType 与个别 return 类型)。我猜你可以使用 Fold 在函数枚举上构建一些东西,如果你真的认为你需要那样的话。

对于你想要的,我更喜欢 C# 中的 LINQ 语法:

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;

这将在 Bind 的 monadic 类型上调用 SelectMany(请参阅 LanguageExt 的文档)。如果每个函数 return 都是正确的,您将获得正确的值——否则,将获得第一个左边的值(第一个错误)。

结果将是任一类型,如 return 值 ReturnEither3。所有单独的函数 (ReturnEither*) 需要相同的左类型,但可以有不同的右类型。