小编mun*_*sen的帖子

试图理解 Haskell 中的错误捕获

在尝试用 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

7
推荐指数
1
解决办法
83
查看次数

标签 统计

haskell ×1