foldl1 (+) []
如何捕获结果错误?
答案 0 :(得分:14)
纯代码可能会抛出异步imprecise exceptions,例如,当部分函数遇到输入时,它无法处理。
这些是逻辑错误,通常表示程序规范中的错误。
它们可能通过exception handler被IO代码(通常在程序的外层)捕获。
例如,要捕获空列表的遗漏案例,
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE BangPatterns #-}
import Control.Exception
main = do
handle (\(e :: SomeException) -> print $ "This program as a bug: " ++ show e) $ do
let !v = foldl1 (+) ([] :: [Int])
return ()
我们可以观察到异常被捕获,程序终止。
$ ./A
"This program as a bug: Prelude.foldl1: empty list"
答案 1 :(得分:6)
答案 2 :(得分:4)
纯粹答案:结果未定义(具体而言,bottom)。如果以任何方式使用该值来构建程序的结果,则除了崩溃之外,您无法执行任何操作。见Haskell 98 Report section 3.1。它指定这样的“错误导致程序立即终止,并且不能被用户捕获。”
最好检查输入值并在它们可以实现之前处理它们。如果列表可以包含0个元素,请不要使用fold1。
在实践中,您可以使用其他答案中的方法在使用GHC时在IO中捕获它。异常不能在纯(非IO)代码中捕获,因为引发异常是控制流的变化是副作用,而不是纯粹的计算。