我正在使用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
谢谢您的任何建议。
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()
在它们之间切换。