将任一 >转换为c#LanguageExt中的Option >

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

我正在使用C#LanguageExt https://github.com/louthy/language-ext

我有一个从Json解析的类MyDto。解析函数返回Either<Error, Mydto>。如果dto匹配给定规则,或者是错误,那么我想取回结果,否则,什么也没有。

最终结果应为Option<Either<Error, Mydto>>类型。

我最终有这样的事情

Option<Either<Error, MyDto>> finalResult =  
     MyDto.From("some json") // Returns Either<Error, MyDto>
          .Right(dto => (dto.Equals("something")
             ? Some<Either<Error, IDhResponse>>(Right(dto))
             : None))
          .Left(error => Some<Either<Error, IDhResponse>>(Left(error)));

我不太喜欢它,因为它重复太多。

然后我尝试了此

MyDto.From("some json") // Returns Either<Error, MyDto>
   .Map(dto => dto.Equals("something")
      ? Some(dto)
      : None)

但是它返回Either<Error, Option<MyDto>>,如果我现在可以将Option带出,它看起来还不错。不幸的是,我找不到任何能做到这一点的东西。

有东西存在吗?还是有一些更好的方法可以完成我的目标?

也许像

 MyDto.From("some json") // Returns Either<Error, MyDto>
   .Where(dto => dto.Equals("something")) // Only applies to Right branch and wrap everything in  Option when fails

谢谢您的任何建议。

c# functional-programming optional either language-ext
1个回答
0
投票
Either<Exception, int> resultOfParsing = Right(10); // Left(new Exception("error")) // version 1: make use of "bottom" state: Either<Exception, int> filterResultUsingBottom = resultOfParsing.Filter(i => i > 5); var textResultUsingBottom = filterResultUsingBottom.Match(i => $"success: {i}", exception => $"error: {exception.Message}", () => "condition: false"); // version 2: inner option Either<Exception, Option<int>> filterResultInnerOption = resultOfParsing .Map(i => Some(i)) .FilterT(i => i > 5); var textResultInnerOption = filterResultInnerOption.Match(noError => noError.Match(i => $"success: {i}", () => "condition: false"), exception => $"error: {exception.Message}"); // version 3: outer option Option<Either<Exception, int>> filterResultOuterOption = filterResultInnerOption.Sequence(); var textResultOuterOption = filterResultOuterOption.Match(noConditionFail => noConditionFail.Match(i => $"success: {i}", exception => $"error: {exception.Message}"), () => "condition: false");

如您所见,所有版本都可以类似的方式使用(Match行)。您应该根据想要在程序中传递的类型来选择所需的版本。

如果您不太在意“条件失败”和“异常”之间的区别,那么版本1(底部)可能就可以了(避免类型嵌套)。但是我个人更喜欢后一种解决方案。您可以根据需要使用.Sequence()在它们之间切换。
© www.soinside.com 2019 - 2024. All rights reserved.