首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Language-ext: chain Either<L,R> with Option?

Language-ext: chain Either<L,R> with Option?
EN

Stack Overflow用户
提问于 2021-06-25 18:50:21
回答 1查看 58关注 0票数 0

我刚刚开始使用language-ext,尝试在我的Azure函数中使用它。

在这个函数中,我首先使用一些验证器解析/验证来自HTTP请求的POSTed数据。这个验证器返回一个Either。然后,我想将一个服务调用链接到任一结果上,该服务调用应该使用请求模型从API获取一些数据,并返回一个选项。在链的末尾,如果在第一步中有ValidationErrors,我想返回一个IActionResult BadRequest,或者在服务调用选项的结果上执行匹配,以返回NotFoundResult或ObjectResult。

我遇到的问题是,如果我想在Either之后链接我的服务调用(使用Bind或BiBind),那么我的服务方法的签名必须是某个Either,这是不正确的,因为我的服务方法与ValidationErrors无关。它应该只返回一个选项。

所以我想我的问题是,如何将任何ValidationErrors保留到链的末尾,并能够将带有选项签名的服务调用链接到任何一个上?

EN

回答 1

Stack Overflow用户

发布于 2021-06-25 21:50:07

你必须决定你的链接表达式的结果是什么。

选项:

代码语言:javascript
复制
var maybeResult = from validated in GetValidationResult(...).ToOption()
                  from apiResult in ApiCall(...)
                  select apiResult;

以下任一项:

代码语言:javascript
复制
var resultOrError = from validated in GetValidationResult(...)
                    from apiResult in ApiCall(...).ToEither(*LEFT*)
                    select apiResult;

你必须用一些错误值或者返回相同类型的错误生成函数来替换*LEFT*,比如GetValidationResultleft类型。

将上面的伪代码替换为您自己的代码,并查看上面使用的函数的返回类型,看看是怎么回事。

之所以需要一个通用的left类型,是因为绑定操作可能会返回第一个(GetValidationResult)或第二个(ApiCall)函数调用的一些错误( left ) --或者如果到达链的成功端,则返回最后一个(ApiCall)函数的错误。

推荐:如果您混合了不同的left (错误)返回类型,您可能希望使用某种类型,比如LanguageExt的内置Error类型,或者只使用一个普通字符串(或Exception)。

使用string作为错误类型:

代码语言:javascript
复制
var resultOrError = from validated in GetValidationResult(...).MapLeft(Prelude.toString)
                    from apiResult in ApiCall(...).ToEither("api call failed")
                    select apiResult;

补充说明:我在这里使用LINQ风格,你可以使用方法风格:

代码语言:javascript
复制
var resultOrError = GetValidationResult(...)
                    .MapLeft(Prelude.toString)
                    .Bind(validated => ApiCall(...)
                                       .ToEither("api call failed"));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68129760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档