语义近似顺序规定,如果函数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