Java的CompletableFuture
是一个Monad,给定其方法thenCompose
和thenApply
对应于Haskell中的CCD_ 4(绑定(和CCD_。
众所周知,任何一个君主都会产生一个应用体。现在,CompletableFuture
有一个与Haskell中的<*>
(ap(相对应的方法吗?或者这样的函数可以根据现有的方法来实现吗?
CompletableFuture
在Haskell中没有直接对应于<*>
的方法。然而,它可以通过翻译相应的Haskell代码,将Monad转换为Applicative:
(<*>) :: Monad f => f (a -> b) -> f a -> f b
(<*>) f a = f >>= (`fmap`a )
根据Java的术语,让我们在Java中调用这个函数alsoApply
:
static <T, R> CompletableFuture<R> alsoApply(CompletableFuture<T> future, CompletableFuture<Function<T, R>> f) {
return f.thenCompose(future::thenApply);
}
有了这个,我们现在可以进行
CompletableFuture<String> future = alsoApply(
CompletableFuture.supplyAsync(() -> "a"),
CompletableFuture.supplyAsync(() -> "b")
.thenApply(b -> a -> a + b));
assertEquals("ab", future.get());
,这导致两个期货返回";a";以及";b";分别在不同的线程上并行运行。