如何绑定多个Either<,>?
Posted
技术标签:
【中文标题】如何绑定多个Either<,>?【英文标题】:How to bind on multiple Either<,>? 【发布时间】:2020-08-21 00:48:00 【问题描述】:我有两个函数返回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
的右边。
【问题讨论】:
Either
长什么样子?也许你可以使用自引用通用约束
我不懂 csharp 语法,但你通常会嵌套绑定调用 either1.Bind((x) => either2.Bind((y) => ReturnEither3(x, y))
。
@bob,就我而言,它是bind
和map
的组合。谢谢!您会将其转换为答案吗?
【参考方案1】:
你不能轻易拥有一些BindAll
,因为你会失去类型安全(MyType
与单独的返回类型)。如果你真的认为你需要这样的东西,我想你可以在函数枚举上使用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
的一元类型上调用 SelectMany
(参见 LanguageExt 的文档)。如果每个函数都返回正确,则您将获得正确的值——否则,获得第一个左侧值(第一个错误)。
结果将是任何类型,例如返回值ReturnEither3
。所有单个函数 (ReturnEither*
) 需要相同的左类型,但可以有不同的右类型。
【讨论】:
以上是关于如何绑定多个Either<,>?的主要内容,如果未能解决你的问题,请参考以下文章
如何在flutter中将Either Right初始化为空值
在 Flutter 中解压 Option<Either<T,T>>