【发布时间】:2018-07-29 16:46:48
【问题描述】:
我正在为 C# 使用 Language-Ext 库,并且我正在尝试链接返回 Either 类型的异步操作。假设我有三个函数,如果它们成功则返回一个整数,如果失败则返回一个字符串,另一个函数将前三个函数的结果相加。在下面的示例实现中,Op3 失败并返回一个字符串。
public static async Task<Either<string, int>> Op1()
{
return await Task.FromResult(1);
}
public static async Task<Either<string, int>> Op2()
{
return await Task.FromResult(2);
}
public static async Task<Either<string, int>> Op3()
{
return await Task.FromResult("error");
}
public static async Task<Either<string, int>> Calculate(int x, int y, int z)
{
return await Task.FromResult(x + y + z);
}
我想链接这些操作,我正在尝试这样做:
var res = await (from x in Op1()
from y in Op2()
from z in Op3()
from w in Calculate(x, y, z)
select w);
但是我们的代码无法编译,因为我收到了 cannot convert from 'LanguageExt.Either<string, int>' to 'int' 的错误 Calculate 的参数。我应该如何链接这些函数?
【问题讨论】:
-
您的 Op2 和 Op3 方法接受参数,但没有提供任何参数?这是复制粘贴错误还是您的代码的实际问题。我在本地测试了您的代码,并在我为 Op2 和 Op3 提供参数后成功构建。
-
确实是一个错字。当
Op2和Op3没有参数时,就会出现问题。
标签: c# functional-programming async-await either language-ext