gpt4 book ai didi

haskell - 如何捕捉异常

转载 作者:行者123 更新时间:2023-12-03 07:42:00 25 4
gpt4 key购买 nike

您如何处理Haskell中的错误?假设我有做除法的函数。如果可以执行除法,则返回true,否则返回false。

di :: Int -> Bool
di a b = a `div` b

如何在这种情况下捕获异常,以便可以返回 bool(boolean) 值?如何捕获所有异常,而不仅仅是特定类型的异常?我知道我可以检查b是否为零,但我只想知道错误处理。

更新:
到目前为止,这是我所做的。但是我收到类型不匹配错误。谁能指出我该如何解决?
di :: Int -> Int -> Bool
di a b = do
result <- try (a `div` b) :: IO (Either SomeException Bool)
case result of
Left ex -> False
Right val -> True

错误
Couldn't match type ‘IO b0’ with ‘Bool’
Expected type: IO (Either SomeException Bool)
-> (Either SomeException Bool -> IO b0) -> Bool
Actual type: IO (Either SomeException Bool)
-> (Either SomeException Bool -> IO b0) -> IO b0

最佳答案

您的代码有几个问题:

  • di在IO monad中运行,因此结果类型需要为IO Bool
  • try需要IO计算,但是div a b是纯值,因此您需要使用return进行提升。
  • 再次,di返回一个IO Bool,因此最后一个case语句需要一个return将case表达式提升为IO计算。

  • 这是 di的版本,可以进行类型检查:
    di' :: Int -> Int -> IO Bool
    di' a b = do
    r <- try (return (div a b)) :: IO (Either SomeException Int)
    return $ case r of
    Left _ -> False
    Right _ -> True

    但是,此版本将为所有输入返回 True。原因是由于懒惰求值,实际上从未调用 div函数。

    解决此问题的一种方法是使用 BangPatterns编译指示强制评估:
    {-# LANGUAGE BangPatterns #-}

    di' :: Int -> Int -> IO Bool
    di' a b = do
    r <- try (let !x = div a b in return x) :: IO (Either SomeException Int)
    return $ case r of
    Left _ -> False
    Right _ -> True

    ghci> di' 3 0
    False

    ghci> di' 3 1
    True

    另请参见此SO问题: How to catch a divide by zero error in Haskell?,以获取有关如何仅捕获算术异常的详细信息。

    关于haskell - 如何捕捉异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33060716/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com