SuperAPI AI 工具集

pattern matching

编程与开发

查看项目

更新于 10-16 11:44

技能介绍

用途

该技能用于指导在 Effect 代码中使用模式匹配(Pattern Matching)替代命令式控制流。它明确要求:简单的 if/else(不嵌套、不含 else if)可以保留,但 else if 链、嵌套条件判断、三元运算符必须改用模式匹配;switch/case 优先使用 Match.type + Match.tag(switch 可作为最后手段接受);单个 null 判断改用 Option.match;链式可选值改用 Option.flatMap + Option.getOrElse;错误检查改用 Either.match 或 Effect.match;类型守卫改用 Match.when 配合 Schema.is();不得直接访问 ._tag,应改用 Match.tag 或 Schema.is()。遇到命令式控制流应立即重构。

主要能力

Effect 的 Match 模块提供:穷尽匹配(编译器确保所有分支被覆盖)、类型收窄(每个分支自动推断类型)、可组合匹配器(由简单模式构建复杂模式)、谓词支持(按条件而非仅按值匹配)。

具体用法包括:

  • Match.value:匹配一个值,示例中通过 Match.when 匹配 "admin"、"user"、"guest" 并以 Match.exhaustive 收尾。
  • Match.type:创建可复用的匹配器,例如 rolePermissions 可多次调用。
  • Match.tag:按 _tag 匹配可辨识联合类型,如 Shape 的 Circle、Rectangle、Triangle 计算面积。
  • 处理 Effect 错误:对 AppError 的 NetworkError、ValidationError、AuthError 分支分别生成提示文本。
  • Match.when 条件与收窄:按数值范围分类;使用 (x): x is string => ... 形式的收窄函数,配合 Match.exhaustive 覆盖 string、number、boolean。
  • 非穷尽处理:Match.orElse 提供默认分支;Match.orElseAbsurd 声称覆盖全部情况,遇到未处理分支时在运行时抛出。
  • 高级模式:Match.not 反向匹配;Match.whenOr 匹配多个模式(如 Saturday、Sunday);Match.whenAnd 组合多个条件(如 role 为 admin 且 verified 为真)。
  • 模式对象与嵌套匹配:按对象形状匹配事件(type 为 click、keydown、submit);嵌套匹配 Response 的 status 与 data.type 组合,如 { status: 200, data: { type: "user" } }。
  • 与 Effect 结合:在 Match.tag 分支中返回 Effect.gen 生成器,执行 Effect.logError、Effect.fail、Effect.succeed、Effect.redirect 等。
  • Schema.is() 与 Match(仅限 Schema 类型):用 Schema.TaggedClass 定义类(含 getter,如 area、circumference),通过 Schema.is(Circle) 既做类型守卫又访问类方法;也可用于 unknown 数据的运行时校验。文档建议:Schema.TaggedError 用于领域错误,它们可与 Schema.is()、Effect.catchTag、Match.tag 配合;Schema.is(ErrorClass) 做错误类型守卫;Effect.catchTag("ErrorName", ...) 处理错误;Match.tag("ErrorName", ...) 在匹配错误时使用(包括谓词)。
  • Schema.is() 与 Match.tag 的取舍:只需数据时用 Match.tag;需要类方法或类型收窄时用 Schema.is()。
  • Option 相关:Option.match 用于单个 Option 到值的转换;如需链式可选操作,应使用 Option.flatMap 链配合 Option.getOrElse,规则是当每个 onNone 分支返回相同值时就应扁平化。

使用方式

技能的正文以代码示例为主要形式,演示从 if/else、switch 重构为 Match 的前后对照,并给出状态机(Draft、Published、Archived 三种文章状态,通过 Schema.is() 访问 isEmpty、daysSincePublish 等方法)的完整示例。文档末尾提到,如需完整的模式匹配文档,可查阅 ${CLAUDE_PLUGIN_ROOT}/references/llms-full.txt,并检索 "Pattern Matching" 章节获取完整 API 参考。

适用场景

适合在 Effect 项目中希望统一控制流风格、消除嵌套条件与 else if 链、借助穷尽检查在编译期发现遗漏分支的开发者;也适用于需要在 Schema 类型联合上做类型收窄并访问类方法的场景。

限制

Schema.is() 相关用法仅适用于 Schema 类型;Match.orElseAbsurd 在遇到未处理分支时会在运行时抛出;简单的不含嵌套的 if/else 仍被允许;switch 被作为最后手段接受。关于该技能的收费、价格、发布平台与版本等信息,暂未提供。