Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 链接返回Vavr的函数_Java_Functional Programming_Monads_Vavr - Fatal编程技术网

Java 链接返回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>>

我有一系列函数,它们接收请求对象并返回Vavr

如果任务已完成,则包含结果对象;如果任务需要由其他函数完成,则包含修改的请求对象

我的想法是,我可以通过这样做将它们链接在一起:

// 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);