【发布时间】:2020-08-23 05:11:33
【问题描述】:
我有一系列函数接收一个 Request 对象并返回一个 Vavr Either。
如果任务完成,Either 将包含一个 Result 对象,如果该任务需要由另一个函数完成,则包含一个修改后的 Request 对象。
当时的想法是,我可以通过以下方式将它们链接在一起:
// 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);
但显然flatMapLeft 不是一个东西,所以我最终在左侧有一个嵌套的 Eithers。关于如何实现此功能的任何想法?我对替代图书馆持开放态度。
编辑:
Result result = function1.apply(request)
.fold(function2, Either::right)
.fold(function3, Either::right)
.fold(terminalFunction, r->r);
似乎这应该可以代替,但是 Intellij 在第二个折叠线上给出了这个错误:
no instance(s) of type variable(s) exist so that capture of ? extends Object conforms to Request
【问题讨论】:
-
你需要把其中的一个拿进来和拿出来。
-
在函数中?我不确定我是否喜欢这样。这里的重点是避免不必要地运行附加功能。
-
flatMapLeft 不是一个东西,因为
Either<A, B>只是B中的一个monad。 -
抱歉,Java 中的流就是这样工作的。
-
如果你想让
Either不偏不倚,它就不能是一个monad,因为monad 需要一个类型参数化的单一类型参数(种类* -> *)。当我们使用Either作为右偏类型时,它通常表示可能失败的计算,monad 实例用于对几个这样的有效计算进行排序。如果您不需要错误上下文,您可以使用无偏见的Either以及 Bifoldable 类型类、它的 catamorphism、功能棱镜甚至裸模式匹配来处理它。不幸的是我不知道 Java/Vavr...
标签: java functional-programming monads vavr