模式匹配

在前面一页中,我们学习了如何使用 type 关键字创建 自定义类型。我们的主要示例是聊天室中的 User

type User
  = Regular String Int
  | Visitor String

常规用户有姓名且年龄,而访问者只有姓名。所以我们有了自定义类型,但是我们如何实际使用它呢?

case

假设我们想要一个 toName 函数来决定要为每个 User 显示的姓名。我们需要使用 case 表达式

toName : User -> String
toName user =
  case user of
    Regular name age ->
      name

    Visitor name ->
      name

-- toName (Regular "Thomas" 44) == "Thomas"
-- toName (Visitor "kate95")    == "kate95"

case 表达式使我们能够根据碰巧看到的变体进行分支,所以无论我们看到的是 Thomas 还是 Kate,我们始终知道如何显示他们的姓名。

如果我们尝试无效的参数,比如 toName (Visitar "kate95")toName Anonymous,编译器会立即告诉我们。这意味着许多简单的错误可以在数秒内修复,而不是让用户发现并总体花费更多的时间。

通配符

我们刚刚定义的 toName 函数效果很棒,但是注意该实现中没有使用 age 吗?当一些关联数据未被使用时,通常会使用“通配符”而不是为其指定名称

toName : User -> String
toName user =
  case user of
    Regular name _ ->
      name

    Visitor name ->
      name

_ 确认了数据的存在,但也明确表示没有人使用它。

条结果与 "" 匹配

    没有结果与 "" 匹配