2015-04-03 39 views
1

對於下面的假設函數(在scala中),函數式編程中適當的返回類型是什麼?異步http請求的適當返回類型? IO [未來[迴應]]或未來[迴應]?或者一些替代?

def execute(req: HttpRequest): <UnknownResultType> 

我會假設IO[Future[Response]],因爲我們既有的網絡副作用,以及異步。

由於這可能有點麻煩(monad包裹在monad中,即使使用monad變換器),FP中是否有更好的抽象來處理這個問題?

+0

「未來」在Scala中經常被用作「IO」(即代表任何老式的效果)。即使在斯卡拉茲,這種慣用類型也是「任務」,這在標準庫的「未來」的相關方面是等價的。 – 2015-04-03 14:17:29

+0

@TravisBrown但我不認爲這會引用透明。因爲我們不能用一次調用它的結果來替換'execute(req)'的多個調用,這將是未來。具體而言,每個「execute(req)'調用都會發送一個單獨的http請求,而未來的結果只會執行一次並緩存結果。另一方面,使用IO將保留RT。 – Pouria 2015-04-03 14:35:21

+1

好吧,我的「在相關方面」被誇大了一點 - 你說得對,斯卡拉的「未來」不給你RT(而「任務」)。無論如何,我認爲你可能不想'IO'和'Future'的表示,你想要一個RT版本的'Future'(比如'Task')。 – 2015-04-03 15:39:05

回答

1

正如@ Travis Brown所說,在Scala中返回純異步計算的最習慣的方式是使用scalaz.concurrent.Task,您可以在scalaz-concurrent庫中找到它。

隨着Task你的函數將如下所示:

def execute(req: HttpRequest): Task[Response] 

execute是一個純函數:無副作用會發生,直到調用Task.run或類似的方法。

欲瞭解更多Task的詳細信息,請參閱this great article

相關問題