簡體   English   中英

“ pure x :: IO a”是純值還是具有副作用的值?

[英]Is `pure x :: IO a` a pure value or one with a side effect?

給定

pure id <*> v = v

持有,可以pure做任何可觀察且不違反法律的事情嗎?

如果我定義一個封裝IO的類型並說產生一個新線程,那么GHC可以自由地對其進行優化嗎?

編輯:我終於意識到問題實際上是關於擁有非法IO實例的后果...

GHC對類型類定律一無所知(與Idris或Coq不同),這些定律僅作為文檔和編程約定存在。 因此,一個實例可能是合法的,也可能是非法的,無論哪種情況,GHC優化都不會改變程序的行為。

如果編寫特定的合法實例,則可以添加REWRITE規則以使GHC刪除pure id ,並且GHC可能最終還會在特定的Applicative函子中優化pure id ,而這種優化的安全性顯而易見。

我必須將您的問題分為兩個問題:

pure x :: IO a純值還是具有副作用的值?

幾乎純凈的價值。 在此代碼中, x的類型是a ,這是一個純值。
pure的類型是a -> IO a ,它用IO包裝參數,但實際上沒有任何副作用。
因此, pure x :: IO a似乎在其類型上有副作用,但實際上沒有。

...純粹可以做任何可觀察到的事情而不違反法律嗎?

pure只是將id應用於v引起的副作用的結果。
只要實例遵循適用法律,它不是pure而是v會引起副作用。

我想您將x換為v :: IO a pure x v :: IO a pure id <*> v v :: IO a
前者是一個類型為a的完全純值,而后者不是一個純值:一種可能會導致副作用返回類型為a的值的操作。

最后一個問題:

如果我定義一個封裝IO的類型並說產生一個新線程,那么GHC可以自由地對其進行優化嗎?

抱歉,我不確定優化。

暫無
暫無

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

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