【发布时间】:2021-09-08 18:36:24
【问题描述】:
我刚开始使用语言扩展,尝试在我的 Azure 函数中使用它。
在这个函数中,我首先使用一些验证器解析/验证来自 HTTP 请求的 POST 数据。
这个验证器返回一个 Either
我遇到的问题是,如果我想在 Either
所以我想我的问题是如何将任何 ValidationErrors 保留到链的末尾,并能够将带有 Option 签名的服务调用链接到 Either?
【问题讨论】:
标签: language-ext
我刚开始使用语言扩展,尝试在我的 Azure 函数中使用它。
在这个函数中,我首先使用一些验证器解析/验证来自 HTTP 请求的 POST 数据。
这个验证器返回一个 Either
我遇到的问题是,如果我想在 Either
所以我想我的问题是如何将任何 ValidationErrors 保留到链的末尾,并能够将带有 Option 签名的服务调用链接到 Either?
【问题讨论】:
标签: language-ext
你必须决定你的链式表达式的结果是什么。
选项:
var maybeResult = from validated in GetValidationResult(...).ToOption()
from apiResult in ApiCall(...)
select apiResult;
要么:
var resultOrError = from validated in GetValidationResult(...)
from apiResult in ApiCall(...).ToEither(*LEFT*)
select apiResult;
您必须将 *LEFT* 替换为某个错误值或返回相同类型的错误生成函数,例如 left 类型的 GetValidationResult。
用你自己的代码替换上面的伪代码,看看上面用到的函数的返回类型,看看发生了什么。
你需要一个通用的left 类型的原因是绑定操作可以返回一些left(错误)的第一个(GetValidationResult)或第二个(ApiCall)函数调用——或者你最后一个( ApiCall) 函数,如果你到达你的链的成功结束。
建议:如果您混合使用不同的 left(错误)返回类型,您可能想要使用类似 LanguageExt 的内置 Error 类型或者可能只是纯字符串(或 Exception)。
string 作为错误类型:
var resultOrError = from validated in GetValidationResult(...).MapLeft(Prelude.toString)
from apiResult in ApiCall(...).ToEither("api call failed")
select apiResult;
补充说明:我这里使用的是LINQ风格,你可以使用方法风格:
var resultOrError = GetValidationResult(...)
.MapLeft(Prelude.toString)
.Bind(validated => ApiCall(...)
.ToEither("api call failed"));
【讨论】: