簡體   English   中英

Haskell的純度是由類型系統還是IO的實現強制執行的?

[英]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安全性是幾種語言特性和屬性的綜合結果,最突出的是:

  • 一個強大的類型系統,不接受用戶“閉嘴,我知道更好”。
  • 輸入所有內容的屬性。 我的意思是,在不純的語言中,你有“語句”,即使類型系統很強大,它也不會超過下一個分號。 而在Haskell中,我們只有表達式,每個表達式的每個位都得到一個類型,並最終影響表達式所在函數的類型。
  • 隱藏類型表示的語言功能。

盡管如此,我認為“類型系統確保不純和純代碼分離”這一表達是一種無害的簡化。

當然,輸出低級原語可能會在任何地方產生副作用。 而且,是的, 只有通過避免出口每種危險物品才能獲得純度。 不需要任何類型級別的機器。

但是,沒有類型限制,與IO相關的一切都是危險的。 所以我們完全不允許IO。 不太有用。

在類型系統的幫助下,我們可以導出一些“危險的”IO動作,知道它們只能在“受控”的地方執行,這些地方必須在其類型中攜帶IO標簽。 使它們不再危險。

因此,純度來自靜態保證和謹慎出口的組合。

暫無
暫無

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

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