[英]Applicative: Prove `pure f <*> x = pure (flip ($)) <*> x <*> pure f`
[英]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.