本文介紹了可完成的未來(lái)是一個(gè)單子。但應(yīng)用性在哪里呢?的處理方法,對(duì)大家解決問(wèn)題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧!
問(wèn)題描述
Java的CompletableFuture
是給出其方法thenCompose
和thenApply
的Monad,其中
對(duì)應(yīng)于Haskell中的>>=
(綁定)和fmap
。
<任何單子都能產(chǎn)生一個(gè)應(yīng)用詞。現(xiàn)在,CompletableFuture
是否有與Haskell中的<*>
(Ap)相對(duì)應(yīng)的方法,或者這樣的函數(shù)可以用現(xiàn)有方法實(shí)現(xiàn)嗎?
推薦答案
CompletableFuture
沒(méi)有與Haskell中的<*>
直接對(duì)應(yīng)的方法。但是,它可以派生為
翻譯將Monad轉(zhuǎn)換為應(yīng)用程序的相應(yīng)Haskell代碼:
(<*>) :: Monad f => f (a -> b) -> f a -> f b
(<*>) f a = f >>= (`fmap`a )
改編Java術(shù)語(yǔ),讓我們?cè)贘ava中調(diào)用此函數(shù)alsoApply
:
static <T, R> CompletableFuture<R> alsoApply(CompletableFuture<T> future, CompletableFuture<Function<T, R>> f) {
return f.thenCompose(future::thenApply);
}
有了這個(gè),我們現(xiàn)在可以
CompletableFuture<String> future = alsoApply(
CompletableFuture.supplyAsync(() -> "a"),
CompletableFuture.supplyAsync(() -> "b")
.thenApply(b -> a -> a + b));
assertEquals("ab", future.get());
,這會(huì)導(dǎo)致分別返回&q;a&q;和&q;b&q;的兩個(gè)期貨在不同的線程上并行運(yùn)行。
這篇關(guān)于可完成的未來(lái)是一個(gè)單子。但應(yīng)用性在哪里呢?的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,