返回

函数式对话 7 - Maybe 和模式匹配,函数式编程中的强大组合

前端

函数式对话 7 - Maybe 和模式匹配

学生: 好久不见啊,今天又有时间来聊天啊

方: 嗯,今天想跟你聊聊 Maybe 和模式匹配

直接上 TypeScript 代码:

const double = (n: number): Maybe<number> => {
  if (n % 2 === 0) {
    return Some(n * 2);
  }
  return None;
};

const result = double(3);

if (result.isSome()) {
  console.log(result.get());
} else {
  console.log("undefined!");
}

最后输出的 undefined! 并不是我们想要的输出,一般你会怎么解决这样的问题?

学生: 可以在 if 语句中直接对 result 进行模式匹配:

const result = double(3);

if (result.isSome()) {
  const value = result.get();
  console.log(value);
} else {
  console.log("undefined!");
}

方: 对,这就是模式匹配的用武之地。模式匹配允许我们优雅地处理 Maybe 值,而不必使用显式的 if 语句。

让我们再看一个例子:

const maybeNumber: Maybe<number> = Some(10);

switch (maybeNumber) {
  case Some(n):
    console.log(`Just a number: ${n}`);
    break;
  case None:
    console.log("Nothing here!");
    break;
}

在上面的例子中,我们使用模式匹配来区分 Maybe 的两种情况:

  • 如果 maybeNumberSome 值,我们就访问其值并打印出来。
  • 如果 maybeNumberNone 值,我们就打印一条消息。

模式匹配不仅适用于 Maybe 类型,还可以用于其他类型,如数组、对象和枚举。它是一种强大的工具,可以使我们的代码更加简洁和可读。

总结

Maybe 和模式匹配是函数式编程中两个重要的概念。它们允许我们优雅地处理缺失值和复杂的数据结构。通过使用 Maybe 和模式匹配,我们可以编写更健壮、更可读的代码。

练习:

尝试使用 Maybe 和模式匹配来解决以下问题:

  • 给定一个数组,找出数组中第一个奇数。
  • 给定一个对象,从对象中提取一个嵌套属性的值(该属性可能不存在)。
  • 给定一个枚举,根据枚举值打印不同的消息。

提示:

  • 使用 Maybe.map()Maybe.filter() 来处理 Maybe 值。
  • 使用 switch 语句或 match 表达式进行模式匹配。