Dart lambda 类型推断
dart lambda type inference
void main() {
print(doStuff.runtimeType);
print(((e) => doStuff(e)).runtimeType);
}
int doStuff(String hallo) {
return 42;
}
在 dartpad 中执行产量
(String) => int
(dynamic) => int
我希望两者具有相同的类型。有人可以解释为什么 dart 无法推断出参数 e 的类型吗?
Dart 类型推断在某些方面受到限制,而纯函数式语言中的推断则没有。
它不是基于约束求解的。
因此,当编译器看到 (e) => doStuff(e)
时,它会检查是否存在可以从中推导出参数类型的上下文类型。
没有(作为 .runtimeType
的接收者没有提供任何提示)。因此,它为参数推断 dynamic
, 需要 一个类型,然后才能对函数主体进行类型分析。
然后它查看正文,发现 doStuff(e)
是有效的并且类型为 int
,因此它变成了 return 类型。
void main() {
print(doStuff.runtimeType);
print(((e) => doStuff(e)).runtimeType);
}
int doStuff(String hallo) {
return 42;
}
在 dartpad 中执行产量
(String) => int
(dynamic) => int
我希望两者具有相同的类型。有人可以解释为什么 dart 无法推断出参数 e 的类型吗?
Dart 类型推断在某些方面受到限制,而纯函数式语言中的推断则没有。 它不是基于约束求解的。
因此,当编译器看到 (e) => doStuff(e)
时,它会检查是否存在可以从中推导出参数类型的上下文类型。
没有(作为 .runtimeType
的接收者没有提供任何提示)。因此,它为参数推断 dynamic
, 需要 一个类型,然后才能对函数主体进行类型分析。
然后它查看正文,发现 doStuff(e)
是有效的并且类型为 int
,因此它变成了 return 类型。