单子式错误处理(Monadic Error Handling)

概念定义:

单子是函数式编程的一个抽象概念,用于封装计算过程,:

  1. 包装一个值(Wrap)
  2. 链式处理这个值
  3. 保持计算的上下文
为什么需要它进行错误处理?

传统错误处理是以:返回值 + 错误码 或者异常处理

// 返回值 + 错误码
int divide(int a, int b, int* result) {
    if (b == 0) return -1;  // 错误码
    *result = a / b;
    return 0;  // 成功
}

// 使用时需要手动检查
int result;
if (divide(10, 2, &result) != 0) {
    // 处理错误
}

问题:

  • 容易忘记检查错误码
  • 错误处理代码与业务逻辑混杂
  • 无法链式调用

单子式方案能够有效避免上述处理的缺点,且性能高:

Result<int> divide(int a, int b) {
    if (b == 0) {
        return Error("Division by zero");
    }
    return a / b;
}

// 链式调用,自动传播错误
auto result = divide(10, 2)
    .and_then([](int x) { return divide(x, 0); })  // 这里出错
    .and_then([](int x) { return divide(x, 2); })  // 自动跳过
    .transform([](int x) { return x * 2; });       // 自动跳过

if (result) {
    std::cout << "Success: " << *result << std::endl;
} else {
    std::cout << "Error: " << result.error().what() << std::endl;
}
核心机制:短路求值

即:在逻辑运算或链式操作中,一旦确定最终结果,就立即停止后续计算。
类似如:

你去餐厅点餐:
1. 检查是否营业 ❌ → 不营业
   └→ 直接离开(不会继续检查菜单、价格等)

2. 检查是否营业 ✅ → 营业中
   └→ 检查是否有座位 ❌ → 没座位
      └→ 直接离开(不会继续点菜)

3. 检查是否营业 ✅ → 营业中
   └→ 检查是否有座位 ✅ → 有座位
      └→ 检查菜单...
         └→ 继续后续流程
单子的三大定律
  • 左单位律 :包装后立即解包 = 不包装
  • 右单位律 :解包后立即包装 = 不操作
  • 结合律 : 链式调用可重组
作者:admin  创建时间:2025-10-09 16:30
最后编辑:admin  更新时间:2025-10-09 16:56