Ocaml在Haskell中“尝试...”

时间:2016-10-12 17:52:41

标签: haskell exception-handling ocaml

我的问题:是否有任何"尝试使用"相当于Haskell?像这样:

try 
{
 head l
}
with 
Failure _ -> []

如果尝试中的操作失败,我们模式匹配错误并在部分中执行适当的工作?

3 个答案:

答案 0 :(得分:3)

你应该通过全部功能来避免这些错误。然后,如果函数可以返回错误,则其返回类型为Either e a,其中e是异常的类型,a是其他成功类型。如果您不需要传递有关例外的任何信息,您只需返回Maybe a

也就是说,Control.Exception有一些设施可以通过trycatch捕获错误,代价是只能在IO monad中进行此类处理。在GHCi,您可以看到:

ghci> import Control.Exception
ghci> catch (head []) (\msg -> putStrLn $ "caught: " ++ show (msg :: SomeException))
caught: Prelude.head: empty list

答案 1 :(得分:2)

您可以使用函数和总函数在大多数情况下实现相同的功能。以你的例子:

diag(s) length(s) diag(dt) length(dt) diag(dip) length(dip)

答案 2 :(得分:0)

在这种简单的情况下,您可以使用foldr

foldr const [] l

甚至直接使用模式匹配:

case l of
  [] -> []
  x : _ -> x

更一般地说,正如其他人所建议的那样,使用MaybeEither可以制作更多模块化代码。您可能需要查看MaybeTExceptT类型以及MonadError类,以将故障集成到monadic计算中。