2012-04-04 27 views
7

最近我一直在閱讀約unsafePerformIO,我想問你一些問題。我確定一個真正的語言應該能夠與外部環境進行交互,因此unsafePerformIO有些合理。如何知道一個明顯純粹的Haskell接口隱藏不安全的操作?

然而,據我所知,我不知道有沒有快速的方法來知道,如果沒有檢查代碼來尋找unsafePerformIO的調用,看起來純粹的(從類型判斷的)接口/庫是否真的很純(文件可以省略提及它)。 我知道它應該只在確定參照透明度得到保證時才使用,但我想知道它。

+3

「我知道它應該只在確定參考透明度得到保證時才使用」。只能在內部操作不能以任何合理的方式泄漏到外面的時候使用,也就是說當無法辨別引擎蓋下是否有這樣的東西時。 – leftaroundabout 2012-04-04 22:38:38

+1

順便說一句,使用'unsafePerformIO'與外部環境進行交互正是你不允許做的事情。所有的效果都應該在你的代碼內部 - 比如在幕後使用可變變量來實現記憶。 – ehird 2012-04-04 23:04:00

+0

@ehird:感謝您的進一步解釋,但是當我編寫「環境」時,我的意思是更廣泛的含義,其中還包括外部(非哈希庫爾)庫。我沒有考慮用戶交互。 – 2012-04-04 23:09:03

回答

10

沒有檢查源代碼是沒有辦法的。但這並不難,因爲Haddock直接在文檔中直接提供了語法高亮的定義。舉例來說,請參見this page上定義右側的「源」鏈接。

Safe Haskell在這裏是相關的;它用於在您想禁止使用不安全功能的情況下編譯Haskell代碼。如果一個模塊使用不安全的模塊(如System.IO.Unsafe),並且沒有明確標記爲Trustworthy,它將繼承其不安全狀態。但使用unsafePerformIO的模塊通常會安全地使用它,因此聲明自己爲Trustworthy

+0

謝謝你,所以它就像我想的那樣...源代碼或什麼也不是。至少,儘管程序員再次保證,安全Haskell可能會幫助自動識別一些不安全的模塊。 – 2012-04-04 22:54:45

5

在你想的情況下,使用unsafePerformIO是不合理的。 documentation for unsafePerformIO解釋了這一點:它僅用於執行者可以證明沒有辦法打破參考透明度,即「純功能性」語義的情況。也就是說,如果任何人使用unsafePerformIO的方式,一個純粹的功能程序可以檢測到它(例如,寫一個函數的結果不僅僅取決於它的參數),那麼這是一個不允許的用法。

如果遇到這種情況,最可能的可能是您發現了一個錯誤。

+2

從這個問題:「我知道只有當你確定參照透明度是有保證的時候才應該使用它,但我想知道它。」 – ehird 2012-04-04 22:43:12

+0

@sacundium:你說得對,我已經看到'unsafePerformIO'的文檔頁面,但這只是一個規則,我不能確定程序員是否有參照透明度的證明:) – 2012-04-04 22:44:10

相關問題