【发布时间】:2016-08-26 11:50:17
【问题描述】:
我一直在摆弄 Haskell,试图理解错误处理。在这样做的同时,我试图掌握如何阅读和理解 GHC 的输出,以便更好地调试类型错误。
我写了以下测试:
import System.Environment
import qualified Control.Exception as Ex
getNum :: Int -> Int
getNum i = (!!) [1,2,3,4] i
outNum :: Int -> IO()
outNum i = Ex.catch (putStrLn(show (getNum i))) (\err -> putStrLn (show err))
main = do
args <- getArgs
outNum 3
这会引发以下错误:
由于使用“Ex.catch”而产生的模棱两可的类型变量“a0”可防止 约束“(Ex.Exception a0)”被解决。
查看所涉及函数的定义:
catch :: IO a -> (IOError -> IO a) -> IO a
putStrLn :: String -> IO ()
show :: Show a => a -> String
error :: [Char] -> a
我看着这个想,a 的类型一定是()(单位类型)。我误解了什么,应该如何修改我的示例以便它捕获异常并显示错误?
【问题讨论】:
标签: haskell exception-handling