假設我們有一個IO動作如折返緩存調用
lookupStuff :: InputType -> IO OutputType
這可能是簡單的東西,如DNS查找,或對不隨時間變化數據的一些Web服務調用。
讓我們假設:
操作不會拋出任何異常和/或從未發散
如果不是爲
IO
單子,該功能將是純的,即結果對於相同的輸入參數總是相同的該操作是可重入的,即它可以安全地從多個線程同時調用。
lookupStuff
操作相當(時間)昂貴。
我面臨的問題是如何正確(和W/O使用任何unsafe*IO*
作弊)實現重入緩存中,可以從多個線程調用,組合多個查詢,對於相同的輸入參數整合成一個請求。
我想我是在類似於GHC的黑洞概念純粹的計算,但在IO「計算」的上下文。
什麼是指定問題的慣用Haskell/GHC解決方案?
的假設1 ,2和3似乎意味着該功能非常純粹,雜質僅僅是一個實現細節。在這種情況下,我認爲使用unsafePerformIO沒有任何問題。實際上,我認爲unsafePerformIO完全適用於這種情況。 – 2011-03-30 10:30:43
同意。 1,2,3是非常強大的假設,在IO中幾乎從不保存代碼,但是如果事實上可以保證這個不安全的PerformaIO是相當合理的。 – 2011-03-30 10:45:01
好吧,但我如何保證IO效果從來不會爲相同的輸入參數執行多次? – hvr 2011-03-30 10:48:07