簡體   English   中英

如果我知道(或合理地預期)IO操作是引用透明的,我可以在其上使用unsafePerformIO嗎? 還是有其他條件?

[英]If I know (or reasonably expect) that an IO action is referentially transparent, can I use unsafePerformIO on it? Or are there other conditions?

假設我有一個函數foo :: String -> IO String ,它向Web服務發出請求,下載一些數據,解析它並返回一個字符串。 我知道,在給定相同的請求字符串的情況下,Web服務將始終返回相同的字符串,除非缺少某種類型的互聯網連接。 這是否足以“安全”使用unsafePerformIO並知道它永遠不會導致問題? 或者我必須確定其他一些東西嗎?

編輯:我考慮這個的原因是因為我有一個函數deduce :: (String -> String) -> String ,它將輸入函數作為參數,並通過用不同的參數進行評估來推斷函數的某些屬性。 現在我想推斷出這個Web服務的一些屬性,但是如果沒有unsafePerformIO我將不得不大幅改變deduce ,包括更改其類型簽名以deduce :: (String -> IO String) -> String這意味着我需要更改所有其他函數我可能想要推斷屬性。

不要那樣做。 unsafePerformIO用於綁定外部基元,執行深度數據結構黑客攻擊,有時還可以建立頂級可變狀態。

這聽起來很安全,但這是一個糟糕的主意,因為當你不期望它們時,你現在會神奇地發生連接,從而使你的程序的其余部分在資源使用方面更難以推理等。

正如大家所指出的,如果服務確實總是返回相同的字符串,那么使用Template Haskell在編譯時一勞永逸地發出請求會更安全,更有效。

編輯:好的,我現在看到了這個問題。 但是您不必更改要推斷其他功能的其他功能的類型。

如果f的類型是String -> String ,那么你總是可以得到return . f :: String -> IO String return . f :: String -> IO String 所以不要搞砸你的其他功能,只需用返回來組合它們。 現在,您可以輕松地處理有效和純粹的代碼。

暫無
暫無

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

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