簡體   English   中英

連續單聲道和異步響應

[英]Continuation Monad and Asynchronous Responses

假設我們有三個同步函數可以通過HTTP獲取數據(這些可以是內部的API調用):

lookupUser :: String -> IO UserId
lookupUserCity :: UserId -> IO City
lookupLocation :: City -> IO Location

因此,我可以執行單子組合lookupLocation <=< lookupUserCity <=< lookupUser以獲取用戶的位置。 但是,由於這些調用中的每一個都會阻塞,因此將阻止程序的其余部分運行。

顯然,延續可以幫助解決此問題,但我找不到任何真正的例子。 我認為簽名將被重寫a -> ContT r IO b ,但是我不知道如何使用此方法來實現類似回調的模式。 如果有人可以告訴我(1)如何編寫transform :: (a -> IO b) -> (a -> ContT r IO b)或(2)可以鏈接到有人這樣做的真實示例,那么我就是感激。

連續只是使用函數的一種模式,它們與異步無關。

您需要的是forkIO或由async之類的庫提供的更高級的抽象。

您可以編寫更一般的transform

transform :: Monad m => (a -> m b) -> a -> ContT r m b
transform k = lift . k

這適用於任何monad而不是僅IO。 但這不是您真正想要的。 正如Nikita Volkov提到的那樣,如果您要進行真正的異步編程,則延續不是解決方案。

我也建議異步庫。

MFlow Web框架允許這種單流。

它只是阻塞等待下一個請求的過程。 這可以在普通的IO monad中完成。 但是還需要其他效果來管理后退按鈕並在超時后恢復執行狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM