结果

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 请求,因此我们很快会再次遇到ResultError 类型!

个匹配 "" 的结果

    没有匹配 "" 的结果