在尝试用 Haskell 编写程序时,我突然意识到我显然不明白错误抛出/捕获异常是如何工作的。虽然我的实际情况要复杂得多,但我想出了一个看似最小的例子,显示了我不明白的内容:
import Control.Exception
import Control.Monad
import Data.Typeable
data IsFalse = IsFalse
deriving (Show, Typeable)
instance Exception IsFalse
isTrue :: Bool -> Bool
isTrue b = if b then b else throw IsFalse
catchesFalse :: Bool -> IO ()
catchesFalse = try . return . isTrue >=> either (\e -> fail $ displayException (e :: IsFalse)) (const $ putStrLn "uh-oh")
main :: IO ()
main = catchesFalse False
Run Code Online (Sandbox Code Playgroud)
运行时runhaskell,我希望上面的代码失败并打印IsFalse。但是,它会打印uh-oh. 在另一方面,如果我取代的定义catchesFalse由
catchesFalse …Run Code Online (Sandbox Code Playgroud) haskell ×1