我的问题:是否有任何"尝试使用"相当于Haskell?像这样:
try { head l } with Failure _ -> []
如果尝试中的操作失败,我们模式匹配错误并在部分中执行适当的工作?
答案 0 :(得分:3)
你应该通过全部功能来避免这些错误。然后,如果函数可以返回错误,则其返回类型为Either e a
,其中e
是异常的类型,a
是其他成功类型。如果您不需要传递有关例外的任何信息,您只需返回Maybe a
。
也就是说,Control.Exception
有一些设施可以通过try
或catch
捕获错误,代价是只能在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
更一般地说,正如其他人所建议的那样,使用Maybe
或Either
可以制作更多模块化代码。您可能需要查看MaybeT
和ExceptT
类型以及MonadError
类,以将故障集成到monadic计算中。