[英]Is Haskell's purity enforced by the type system or IO's implementation?
總是說Haskell的類型系統可以防止不純的代碼污染純代碼,因為你總是必須在類型簽名中指定IO
。 但是,這是類型系統本身的結果,還是只是IO(..)
沒有導出?
基本上,如果類型構造函數可用,這樣的事情可以做到嗎?
ioToPure :: IO a -> a
ioToPure (IO ioValue) = ioValue
是的,這在某種意義上是正確的。
類型系統本身並不了解IO
也不需要。 隱藏來自用戶的IO操作的真實表示的是不同的語言功能,因此不可能“僅運行”IO操作。
所以,事實是,Haskell和類似語言中的IO安全性是幾種語言特性和屬性的綜合結果,最突出的是:
盡管如此,我認為“類型系統確保不純和純代碼分離”這一表達是一種無害的簡化。
當然,輸出低級原語可能會在任何地方產生副作用。 而且,是的, 只有通過避免出口每種危險物品才能獲得純度。 不需要任何類型級別的機器。
但是,沒有類型限制,與IO相關的一切都是危險的。 所以我們完全不允許IO。 不太有用。
在類型系統的幫助下,我們可以導出一些“危險的”IO動作,知道它們只能在“受控”的地方執行,這些地方必須在其類型中攜帶IO
標簽。 使它們不再危險。
因此,純度來自靜態保證和謹慎出口的組合。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.