語義近似順序規定,如果函數f
是在其參數不是其中的一個時定義的,那麼f
在該參數中是常量(它不使用它)。但考慮這個功能,catch違反了語義逼近順序?
import Control.Exception
handleAll :: SomeException -> IO()
handleAll e = putStrLn "caught"
f :: String -> IO()
f x = catch (putStrLn x) handleAll
f undefined
顯示在GHCI caught
,所以看起來定義。但是f
在它的論點中並不是不變的,因爲f "test"
顯示爲test
。
某處有錯嗎?
沒有錯誤 - 此原則僅適用於純功能。 (注意,即使這是不正確的,由於seq和朋友)。你只能看到區別,因爲你正在執行'IO'動作,'技術上'只能在'main'中使用' - 所有其他的'IO'操作只是建立新的術語,或者你不能觀察術語輸入'IO x'。 – user2407038
'seq'不違反這裏討論的原則。 –
'catch'事實上很難找到正確的答案。實際上,我在過去的一兩週內一直在努力修復相關的GHC錯誤。 – dfeuer