Haskell 会出现哪些类型的运行时错误?

What kinds of runtime errors can Haskell have?

我读到 Haskell 实际上可能会出现运行时错误,尽管它是静态类型和功能性的。但是,没有人说 可能是什么 运行时错误。有人知道吗?

标准库(base 包)可能抛出的所有运行时异常都在 Control.Exception and GHC.Exception.

中定义

error是GHC.Err中定义的函数(基于GHC.Exception)如

error :: [Char] -> a
error s = raise# (errorCallException s)

如果某些处理程序未捕获到 ErrorCall 异常,它会抛出一个 ErrorCall 异常并将错误消息打印到 stderr,大多数 run-time 异常是由 base 中的纯函数引发的由 error.

实施

几个例子:

undefined,代码尚未实现的占位符,定义为

undefined :: a
undefined = error "undefined"

由于它的类型,它将通过编译步骤,并且在 run-time 处计算时会引发异常。

由于历史原因,GHC 标准库导出了部分函数,​​例如head:

head                    :: [a] -> a
head (x:_)              =  x
head []                 =  badHead

badHead :: a
badHead = errorEmptyList "head"

errorEmptyList :: String -> a
errorEmptyList fun =
    error (prel_list_str ++ fun ++ ": empty list")

IOException 总结了您可能在其他编程语言中看到的大多数普通 IO 异常,例如FileNotFound、NoPermission、UnexpectedEOF 等。在 System.IO.Error 中进一步扩展,仅在 IO monad 的上下文中抛出。

base中有六个算术异常,分别是

data ArithException
  = Overflow
  | Underflow
  | LossOfPrecision
  | DivideByZero
  | Denormal
  | RatioZeroDenominator

两个数组访问异常,分别是:

data ArrayException
  = IndexOutOfBounds    String
  | UndefinedElement    String

四种异步异常,即设计用于在进程之间传递的异常,它们是:

data AsyncException
  = Whosebug
  | HeapOverflow
  | ThreadKilled
  | UserInterrupt

当计算显然不会终止时:NonTermination
当一个或多个进程永远阻塞时:BlockedIndefinitelyOnMVar, Deadlock,等等
当模式匹配失败时(主要在 monad 中):PatternMatchFail
当断言失败时:AssertionFailed

还有很多很多。