我开始在 C# 中实现 LanguageExt.Core 库,构建一个最小的 API 项目。现在,我有一个
Validate
类,它运行所有验证,您可以使用 runtime.Validate
执行这些验证,该类已更改为返回 string
类型,而不是用于演示目的。该方法的签名为 Aff<Validation<Error, string>>
,并且在我的运行时中定义如下:
public Aff<Validation<Error, string>> Validate => SuccessAff(Validation<Error, string>.Success("My success response"));
我执行这些验证的类定义如下:
using LanguageExt;
using LanguageExt.Common;
using static LanguageExt.Prelude;
namespace ApplinxChannel.Api;
internal static class Validation
{
internal static Eff<TRuntime, string> Validate<TRuntime, TRequest, TClean>(TRequest request)
where TRuntime : struct,
HasValidator<TRequest, TClean>
where TRequest : notnull
where TClean : notnull
{
return from runtime in Eff<TRuntime, TRuntime>(identity)
let clean = runtime.Validate.Bind(x => x.ToEff(errors =>
errors.Aggregate(Error.New("Errors:"), (e1, e2) => e1.Append(e2))))
select clean;
}
}
问题是:
return
方法中的 Eff<TRuntime, string> Validate
语句返回 Eff<TRuntime, Aff<string>
,并且抛出以下错误:
“无法将类型 'LanguageExt.Eff我试图从
Aff<string>
中获取内部:
from validationAff in runtime.Validate(request)
但它会抛出这个错误:
“无法将类型‘LanguageExt.Aff此外,我还尝试使用以下代码来达到
string
,例如:
from runtime in Eff<TRuntime, TRuntime>(identity)
let validationAff = runtime.Validate.Bind(x => x.ToEff(errors =>
errors.Aggregate(Error.New("Errors:"), (e1, e2) => e1.Append(e2))))
select validationAff;
但它确实在
Aff<string>
上给了我 select validationAff
,这与最终的 Eff<TRuntime, string>
预期不符,因为这会产生 Eff<TRuntime, Aff<string>>
。
期望能够使用
string
或类似 Validate
的方法从 select validationAff
方法获取 select clean
对象。现在,代码会产生编译错误,因为 Validate
方法签名定义为 Eff<TRuntime, string> Validate
并且 return
语句正在创建 Eff<TRuntime, Aff<string>>
类型的对象
任何想法或建议都非常感激。
您应该能够通过在 LINQ 表达式中使用
Eff
而不是 Aff
来删除 from
/ let
类型的嵌套:
from runtime in Eff<TRuntime, TRuntime>(identity)
from validation in runtime.Validate.Bind(x => x.ToEff(errors =>
errors.Aggregate(Error.New("Errors:"), (e1, e2) => e1.Append(e2))))
select validation;
正如其他人所说,您那里的代码不属于语言前