使用单个case子句处理Haskell异常?

时间:2014-06-14 22:45:45

标签: exception haskell exception-handling monads

考虑以下问题。

我正在为一些字符串函数编写包装器;其中一个是来自chr的{​​{1}}(例如)。现在,如果我的API的输入是一个错误的输入,我想抛出一个错误,否则,我只想返回整数输出。我想保持算法简单 -

Data.Char

这显然不是任何Haskell代码,而是对我希望算法看起来像什么的描述。我已经看到了getChr someInput = do x <- chr someInput -- this doesn't evaluate unless we evaluate ourselves -- handle exception here result = <_some_evaluation_> case result of Left _ -> custom error throw Right _ -> return something 示例,但我不确定的返回try (evaluate _)类型值可以用简单的case语句来处理。我想要一些非常简单的东西,所以我可以根据自己的需要加以说明。有办法吗?

2 个答案:

答案 0 :(得分:1)

try适用于此。

getChr someInput = do
  x <- chr someInput
  result = try (some_evaluation x)
  case result of
    Left  (SomeException _) -> print "Oh no!"
    Right val               -> print val

答案 1 :(得分:0)

我猜你的问题可能是你想要只抓住一些特定的例外,对吧?然后你需要确保将异常转换到某个地方,以便它的类型比SomeException更特殊。例如:

do
  result <- try something
  case result of
    Left  e  -> print (e :: IOException)
    Right x  -> return x

或者,如果您要放弃该例外,请将其投放到const

do
  result <- try something
  case result of
    Left  e  -> const (print "whatever") (e :: IOException)
    Right x  -> return x