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
函数更难。
该算法不知道第一个参数应该是什么类型。应该是T
,fold
的类型参数,但我们还不知道T
。它不能使用正文,因为在它具有参数类型之前它无法对正文进行类型分析(即使可以,也有许多参数类型可以使正文有效;dynamic
, int
、num
和 double
是潜在的候选者,并且可以有更多的用户类型,您可以向它们添加 int
。)
在没有来自外部的提示的情况下,类型推断使用 top-type 并得到 (Object? previousValue, int element) => ...
。然后它无法接受 previousValue + element
.
reduce
没有失败的原因是它拥有所有必要的信息。两个参数的类型必须为 int
,即列表的元素类型。
使用 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
函数更难。
该算法不知道第一个参数应该是什么类型。应该是T
,fold
的类型参数,但我们还不知道T
。它不能使用正文,因为在它具有参数类型之前它无法对正文进行类型分析(即使可以,也有许多参数类型可以使正文有效;dynamic
, int
、num
和 double
是潜在的候选者,并且可以有更多的用户类型,您可以向它们添加 int
。)
在没有来自外部的提示的情况下,类型推断使用 top-type 并得到 (Object? previousValue, int element) => ...
。然后它无法接受 previousValue + element
.
reduce
没有失败的原因是它拥有所有必要的信息。两个参数的类型必须为 int
,即列表的元素类型。