[英]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)可以鏈接到有人這樣做的真實示例,那么我就是感激。
您可以編寫更一般的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.