结果
Maybe
类型可以帮助处理可能失败的简单函数,但它不会告诉你原因。想象一下,如果编译器在程序出现任何问题时都说无
。这样想要找出是什么出了问题就难上加难了!
在这种情况下,Result
类型就很有用。它的定义如下
type Result error value
= Ok value
| Err error
这种类型的目的是在发生问题时提供附加信息。它有助于错误报告和错误恢复!
错误报告
我们可能有一个网站,人们可以在上面输入自己的年龄。我们可以使用此类函数检查年龄是否合理
isReasonableAge : String -> Result String Int
isReasonableAge input =
case String.toInt input of
Nothing ->
Err "That is not a number!"
Just age ->
if age < 0 then
Err "Please try again after you are born."
else if age > 135 then
Err "Are you some kind of turtle?"
else
Ok age
-- isReasonableAge "abc" == Err ...
-- isReasonableAge "-13" == Err ...
-- isReasonableAge "24" == Ok 24
-- isReasonableAge "150" == Err ...
我们不仅可以检查年龄,还可以根据他们输入内容的具体情况向人们显示错误消息。这种类型的反馈比无
要好得多!
错误恢复
Result
类型也可以帮助你从错误中恢复。你在执行 HTTP 请求时会看到这一点。假设我们想显示列夫·托尔斯泰的《安娜·卡列尼娜》的全文。我们的 HTTP 请求会产生一个Result Error String
来捕获请求可能会成功,附带全文,也可能以多种不同的方式失败的事实
type Error
= BadUrl String
| Timeout
| NetworkError
| BadStatus Int
| BadBody String
-- Ok "All happy ..." : Result Error String
-- Err Timeout : Result Error String
-- Err NetworkError : Result Error String
然后,我们可以显示前面讨论的更友好的错误消息,但我们也可以尝试从失败中恢复!如果看到超时
,可能会等待片刻再重试。而如果我们看到错误状态 404
,那就没有必要重试了。
下一章将展示如何实际执行 HTTP 请求,因此我们很快会再次遇到Result
和Error
类型!