如何绑定多个Either<,>?
How to bind on multiple Either<,>?
我有两个函数 return Either<Error,?>
,第二个函数依赖于第一个函数。
Either<Error, bool> either1 = ReturnEither1(...);
Either<Error, int> either2 = either1.Bind(ReturnEither2);
现在,我有第三个函数,它依赖于 either1
和 either2
,它的 left 类型也是 Error
。我怎样才能做类似下面的事情?
Either<Error, MyType> either3 = [either1, either2].BindAll(...);
所以我希望either3
绑定到either1
和either2
的右。
您不能轻易拥有某些 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*
) 需要相同的左类型,但可以有不同的右类型。
我有两个函数 return Either<Error,?>
,第二个函数依赖于第一个函数。
Either<Error, bool> either1 = ReturnEither1(...);
Either<Error, int> either2 = either1.Bind(ReturnEither2);
现在,我有第三个函数,它依赖于 either1
和 either2
,它的 left 类型也是 Error
。我怎样才能做类似下面的事情?
Either<Error, MyType> either3 = [either1, either2].BindAll(...);
所以我希望either3
绑定到either1
和either2
的右。
您不能轻易拥有某些 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*
) 需要相同的左类型,但可以有不同的右类型。