gpt4 book ai didi

exception - haskell "exceptions"

转载 作者:行者123 更新时间:2023-12-03 21:17:08 28 4
gpt4 key购买 nike

我有一组用户、组以及用户和组之间的映射。我有各种操作这些集合的函数,但是不能为不存在的用户添加用户<->组映射,也不能删除仍然有用户作为成员的组等。

所以基本上我希望这些函数抛出必须由调用者明确处理的“异常”。

我首先想到的是返回这样的东西:

data Return r e = Success r | Exception e

如果调用者未能与 Exception 进行模式匹配, ,他们有希望得到一个编译器警告,或者至少在出现问题时有一个明显的运行时错误。

这是最好的方法吗,是否有一个预先打包的解决方案可以做到这一点?注意我需要在纯代码中抛出和捕获“异常”,而不是 IO Monad。

最佳答案

是的,这是一个很好的方法,它在标准库中:Return r eEither e r 相同.您甚至可以像使用 IO 中的异常一样编写代码。 ,也一样(即不必在每个步骤中使用模式匹配显式处理错误):Monad Either 的实例传播错误,就像 Maybe monad 可以(但在出现错误的情况下会附加 e 值)。例如:

data MyError
= Oops String
| VeryBadError Int Int

mightFail :: T -> Either MyError Int
mightFail a = ...

foo :: T -> T -> Int -> Either MyError Int
foo a b c = do
x <- mightFail a
y <- mightFail b
if x == y
then throwError (VeryBadError x y)
else return (x + y + c)

如果 mightFail amightFail b返回 Left someError ,然后 foo a b c也会;错误会自动传播。 (这里, throwError 只是写 Left 的好方法,使用 Control.Monad.Error 中的函数;还有 catchError 来捕获这些异常。)

关于exception - haskell "exceptions",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10611382/

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