Dart List.fold vs List.reduce 类型推断

Dart List.fold vs List.reduce type inference

使用 Dart 2.14.2 我 运行 下面的代码

void main(List<String> args) {
  var a = <int>[1, 2, 3];

  final foldValue = a.fold(0, (previousValue, element) => previousValue + element);
  final reduceValue = a.reduce((previousValue, element) => previousValue + element);
}

对于包含 foldValue 的行,分析器给出以下错误:

Error: The operator '+' isn't defined for the class 'Object?'.

没有给出包含 reduceValue.

的行的任何错误

我的问题是:是什么导致 List.fold 引发此类错误而 List.reduce 却没有?

List.fold 问题是 Dart 类型推理算法的 well-known 限制。 由于您没有为 fold 提供类型参数,类型推断会为每个参数 独立地 推断静态类型,然后尝试将它们组合起来以找到 的有效类型参数=11=] 本身。 这两个参数是独立推断的并且没有类型提示

0 参数很简单,类型为 int

(previousValue, element) => previousValue + element函数更难。 该算法不知道第一个参数应该是什么类型。应该是Tfold的类型参数,但我们还不知道T。它不能使用正文,因为在它具有参数类型之前它无法对正文进行类型分析(即使可以,也有许多参数类型可以使正文有效;dynamicintnumdouble 是潜在的候选者,并且可以有更多的用户类型,您可以向它们添加 int。)

在没有来自外部的提示的情况下,类型推断使用 top-type 并得到 (Object? previousValue, int element) => ...。然后它无法接受 previousValue + element.

reduce 没有失败的原因是它拥有所有必要的信息。两个参数的类型必须为 int,即列表的元素类型。