使用 LanguageExt.Core 库时如何从 Aff<string> 中获取字符串

问题描述 投票:0回答:1

我开始在 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' 隐式转换为 'LanguageExt.Eff

我试图从

Aff<string>
中获取内部:

from validationAff in runtime.Validate(request)
但它会抛出这个错误: “无法将类型‘LanguageExt.Aff>’隐式转换为‘LanguageExt.Guard’”

此外,我还尝试使用以下代码来达到

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>>

类型的对象

任何想法或建议都非常感激。

c# functional-programming language-ext
1个回答
0
投票

您应该能够通过在 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;

正如其他人所说,您那里的代码不属于语言前

© www.soinside.com 2019 - 2024. All rights reserved.