【发布时间】:2010-09-25 21:07:18
【问题描述】:
我正试图了解 Haskell 中的错误处理。我找到了文章“8 ways to report errors in Haskell”,但我很困惑为什么 Maybe 和 Either 的行为不同。
例如:
import Control.Monad.Error
myDiv :: (Monad m) => Float -> Float -> m Float
myDiv x 0 = fail "My divison by zero"
myDiv x y = return (x / y)
testMyDiv1 :: Float -> Float -> String
testMyDiv1 x y =
case myDiv x y of
Left e -> e
Right r -> show r
testMyDiv2 :: Float -> Float -> String
testMyDiv2 x y =
case myDiv x y of
Nothing -> "An error"
Just r -> show r
调用testMyDiv2 1 0 得到"An error" 的结果,但调用testMyDiv1 1 0 得到:
"*** Exception: My divison by zero
(请注意缺少右引号,表明这不是字符串而是异常)。
什么给了?
【问题讨论】:
-
我使用 mtl-1.1.0.2 为
testMyDiv1 1 0得到"My division by zero"。你用的是哪个Control.Monad.Error? -
正如 sepp2k 所说,这取决于
Either和Maybe的instance Monad声明。理想情况下,您应该使用最新基础中的instance Monad (Either String)或mtl或monads-{fd,tf}中的一个。 -
我注意到我收到很多“您正在使用旧包 `base' 版本 3.x。未来的 GHC 版本将不支持基本版本 3.x。您应该更新您的代码以使用新的基本版本 4.x。”错误。所以也许我的 ghc 安装已经过时了?阴谋集团更新不适用任何东西。我正在考虑删除我的安装并重新开始。
-
base不会被 cabal-install 更新,因为 GHC 使用 base 你必须同时更新两者。我建议你使用 GHC 6.12.x 或等待 GHC 7.0。
标签: haskell error-handling monads