如何绑定多个Either<,>?

Posted

技术标签:

【中文标题】如何绑定多个Either<,>?【英文标题】:How to bind on multiple Either<,>? 【发布时间】:2020-08-21 00:48:00 【问题描述】:

我有两个函数返回Either&lt;Error,?&gt;,第二个函数依赖于第一个。

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

现在,我有第三个函数,它同时依赖于either1either2,它的left 类型也是Error。我该如何执行以下操作?


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

所以我希望either3 绑定到either1either2右边

【问题讨论】:

Either 长什么样子?也许你可以使用自引用通用约束 我不懂 csharp 语法,但你通常会嵌套绑定调用 either1.Bind((x) =&gt; either2.Bind((y) =&gt; ReturnEither3(x, y)) @bob,就我而言,它是bindmap 的组合。谢谢!您会将其转换为答案吗? 【参考方案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初始化为空值

在 Haskell 中组合任何类型的绑定

如何跨多个函数使用变量?

在 Flutter 中解压 Option<Either<T,T>>

Kotlin 的 Arrow Either<Exception, X> 和事务

如何使用多个绑定将 WCF json 绑定到 https?