Java 链接返回Vavr的函数
我有一系列函数,它们接收请求对象并返回Vavr 如果任务已完成,则包含结果对象;如果任务需要由其他函数完成,则包含修改的请求对象 我的想法是,我可以通过这样做将它们链接在一起:Java 链接返回Vavr的函数,java,functional-programming,monads,vavr,Java,Functional Programming,Monads,Vavr,我有一系列函数,它们接收请求对象并返回Vavr 如果任务已完成,则包含结果对象;如果任务需要由其他函数完成,则包含修改的请求对象 我的想法是,我可以通过这样做将它们链接在一起: // Note: The Request object parameter is modified by the function // before being returned in the Either. Function<Request, Either<Request,Result>>
// Note: The Request object parameter is modified by the function
// before being returned in the Either.
Function<Request, Either<Request,Result>> function1;
Function<Request, Either<Request,Result>> function2;
Function<Request, Either<Request,Result>> function3;
Function<Request, Result> terminalFunction;
Result result = function1.apply(request)
.flatMapLeft(function2)
.flatMapLeft(function3)
.fold(terminalFunction, r->r);
看起来这应该是可行的,但是Intellij在第二行给出了这个错误:
no instance(s) of type variable(s) exist so that capture of ? extends Object conforms to Request
Result=function1.apply(请求)
.fold(函数2,任意一个::右)
.fold(功能3,任意一个::右)
.折叠(终端功能,r->r);
虽然有点笨重,但这似乎有效。这是对图书馆的滥用吗?我想听听其他的方法 您的
请求
端需要一元合成,它在您的类型签名的左侧,但您的或端都有一元合成。因此,您需要在函数定义中交换它们,或者必须使用
Function1.of(SomeType::function1).andThen(Either::swap)
基本上,每个函数[1-3]
都会变成以下类型:
Function<Request, Either<Result, Request>>
你需要在函数中输入或输出?我不确定我是否喜欢那样。这里的要点是避免不必要地运行附加函数。flatMapLeft不是一件事,因为Orther
在B
中只是一个单子。对不起,这就是流在Java中的工作方式。如果你想Orther
不带偏见,它不能是单子,因为monad需要使用单个类型参数(种类*->*
)参数化的类型。当我们使用
或
作为右偏类型时,它通常表示可能失败的计算,并且monad实例用于对这些有效计算进行排序。如果不需要错误上下文,可以使用无偏的或以及双折叠类型类、其亚同构、函数棱柱或甚至裸模式匹配来处理它。不幸的是,我不知道Java/Vavr…Vavr的目的是保存结果或错误情况。OP把它当作一个元组来滥用。有趣!我猜这种方法的缺点是你最终打破了“左等于失败,右等于成功”的惯例,但它可能更好地使用了预期的数据结构。创建或的人可能已经想到了类似的事情,但不一定(我不知道历史),由此产生的构造不再真正关心了。您可以将左侧视为提前返回或短路,将右侧视为进一步处理的候选对象,即绑定。如果你忘记了留下的错误,用这些术语思考,一切都变得更有意义了。
Function1.of(SomeType::function1).andThen(Either::swap)
Function<Request, Either<Result, Request>>
Result result = function1.apply(request)
.flatMap(function2)
.flatMap(function3)
.swap()
.getOrElseGet(terminalFunction);