E4105

E4105#

当前循环的结果类型与 break 参数的类型不匹配。

当提供给 break 语句的参数类型与循环的预期结果类型不匹配时,会发生此错误。在 MoonBit 中,循环可以有结果类型,当使用带有参数的 break 时,该参数的类型必须与循环的结果类型匹配。当没有提供参数时,循环的结果类型必须是 Unit

此不匹配可能发生在两种方式中:

  1. 循环期望一个特定类型的值,但 break 没有提供参数

  2. 循环期望一个类型为 A 的值,但 break 提供了类型为 B 的参数

对于具有结果类型的循环,您必须确保:

  • 所有 break 语句都提供正确类型的参数

  • else 分支(如果存在)返回正确类型的值

错误示例#

pub fn g(x: Int) -> Int {
  for i in 0..=x {
    if i == 42 {
      break
//    ^^^^^ Error: Current loop has result type Int, but `break` is supplied
//                 with no arguments.
    }
  } else {
    0
  }
}

建议#

要修复此错误,您可以:

  • break 语句添加一个与循环结果类型匹配的参数。例如:

pub fn g(x: Int) -> Int {
  for i in 0..=x {
    if i == 42 {
      break i
    }
  } else {
    0
  }
}
  • 如果不需要从循环中返回值,请删除 else 分支。

pub fn g(x: Int) -> Unit {
  for i in 0..=x {
    if i == 42 {
      break
    }
  }
}