首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LangageExt:用Bind()链接两个之一,但也不知道如何使用它们来创建另一个

LangageExt:用Bind()链接两个之一,但也不知道如何使用它们来创建另一个
EN

Stack Overflow用户
提问于 2020-07-15 05:07:34
回答 2查看 419关注 0票数 0

我使用LanguageExt在C#中具有函数式编程特性。我有一个方法,在这个方法中,我希望构建一个VaultSharp实例来访问我们的HashiCorp Vault服务。我的目标是通过两个参与者链创建一个VaultClientSettings实例(参见下面的方法)。最后,要么从链中的任意一个返回异常,要么从VaultClientSettings的实例返回异常。我认为我离得很近,但无法完成最后一步。我很感谢你的建议。

下面是指向C#的FP库和VaultSharp库的链接;

下面的图片显示了我所看到的错误:

代码语言:javascript
复制
            Either<Exception, Uri> GetVaultUri() =>
                EnvironmentVariable.GetEnvironmentVariable(KVaultAddressEnvironmentVariableName)
                    .Map(uri => new Uri(uri));

            Either<Exception, TokenAuthMethodInfo> GetAuthInfo() =>
                EnvironmentVariable.GetEnvironmentVariable(KVaultTokenEnvironmentVariableName)
                    .Map(token => new TokenAuthMethodInfo(token));

            Either<Exception, VaultClientSettings> GetVaultClientSettings(
                Either<Exception, Uri> vaultUri,
                Either<Exception, TokenAuthMethodInfo> authInfo
            )
            {
                /////////////////////////////////////////////////////////////////////////
                // I have access to the uri as u and the authmethod as a, but I cannot //
                // figure out how to create the instance of VaultClientSettings.       //
                Either<Exception, VaultClientSettings>  settings =
                    vaultUri.Bind<Uri>(u =>
                        authInfo.Bind<TokenAuthMethodInfo>(a =>
                        {
                            Either<Exception, VaultClientSettings> vaultClientSettings = 
                                              new VaultClientSettings(u.AbsoluteUri, a);

                            return vaultClientSettings;
                        }));
            }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-15 06:45:33

没有使用这两个库,但是查看了Bind的签名

Either<L, B> Bind<B>(Func<R, Either<L, B>> f)

从签名判断,下列内容应有效:

代码语言:javascript
复制
Either<Exception, VaultClientSettings>  settings =
    vaultUri.Bind<VaultClientSettings>(u =>
        authInfo.Bind<VaultClientSettings>(a =>
        {
            Either<Exception, VaultClientSettings> vaultClientSettings = new VaultClientSettings(u.AbsoluteUri, a);

            return vaultClientSettings;
        }));
票数 1
EN

Stack Overflow用户

发布于 2020-07-15 09:31:25

正如@hayden已经指出的:绑定类型参数是错误的(需要是“正确”的结果类型,无论哪种类型)。

对于LanguageExt:如果返回正确的类型,甚至可以省略类型参数:

代码语言:javascript
复制
Either<Exception, VaultClientSettings>  settings =
                    vaultUri.Bind(u =>
                        authInfo.Bind(a =>
                        {
                            Either<Exception, VaultClientSettings> vaultClientSettings = 
                                              new VaultClientSettings(u.AbsoluteUri, a);

                            return vaultClientSettings;
                        }));

此代码的另一种形式(LINQ)可能更易读:

代码语言:javascript
复制
var settings = from u in vaultUri
               from a in authInfo
               select new VaultClientSettings(u.AbsoluteUri, a);

本质上BindSelectMany (来自.)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62907947

复制
相关文章

相似问题

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