复杂的未来是一个Monad.但是应用程序在哪里



Java的CompletableFuture是一个Monad,给定其方法thenComposethenApply对应于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";分别在不同的线程上并行运行。

最新更新