当类型与其他类型一起操作时,类型推断足够聪明以找出类型

Xiaohe Dong

假设此类型的推理代码用于列表中的推理元素,

def doStuff[A](x: List[A]) = x // ignore the result 

doStuff(List(3)) // I dont need to speicify the type Int here

但是,如果类型A与其他类型一起使用,则类型推断不起作用,我必须指定类型。

def doStuff[A, B](x: List[A], f: (B, A) => B) = {

}

doStuff(List(3), (x: String, y) => x) //compilation failed, missing parameter type
doStuff[Int, String](List(3), (x, y) => x) //compilation fine.

我可以知道为什么吗?

提前谢谢了

gzm0

类型推断仅适用于单独的参数列表。如果更改doStuff为以下内容:

def doStuff[A, B](x: List[A])(f: (B, A) => B) = {

}

类型推断将按您期望的那样工作:

doStuff(List(3))((x: String, y) => x)

但是,请注意,类型推断是从左到右的,因此,如果将其Nil作为第一个参数,它将进行推断A = Nothing,而这几乎永远不是您想要的。

更新

在您的原始示例中,调用doStuff(List(3), (x: String, y) => x)失败,因为y无法推断lambda的类型List(3)是相同的参数列表,因此A尚不清楚。因此,没有提示的类型,y并且编译器将失败。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

输入类型=“ file”与其他输入类型一起使用时显示奇怪的行为

Java 8流-与其他累加器返回类型一起使用reduce

在haskell中将Bool与其他数值类型一起使用

如何与其他类型的测试一起运行黄瓜场景?

如何在Haskell中将fold函数与其他数据类型一起使用

为什么当 __add__ 不能时 list.__iadd__ 可以与其他可迭代对象类型一起使用?

当嵌套表与其他数据类型混合在一起时,如何在Lua中循环浏览嵌套表?

正确的JSON类型定义可与其他结构和枚举的运行时模块结构一起导入

类型推断如何与可选参数一起使用?

根据其他推断参数类型

C样式类型注释与其他

聪明的方式来获得类型推断?

与其他类型相交的类型永不等于

指定其他类型时,如何让TypeScript推断受约束的泛型类型的值?

如何使用 mysql 5.7 修复 adminer.php json 错误,因为它可以与其他数据类型一起正常工作?

在 Scala 中将类型 lambda 与更高级的类型一起使用:如何让编译器正确推断类型?

如何在TypeScript中创建将其他类型组合在一起的通用类型?

如何停止我的一种类型的对象与其他类型的对象交互?

如何创建行为与其他类型一样的类型?

如何正确一起使用size_t和其他整数类型?

类型检查与类型推断

存在类型的类型推断

将布尔类型与类型2 DQL一起转换

泛型类型推断不能与方法链接一起使用?

JDK 8的类型推断如何与泛型一起工作?

如何在assertThat中将hamcrest nullValue与类型推断一起使用

类型推断如何与重载泛型方法一起工作

根据方法中的其他参数推断参数类型

组合无类型和类型常量时的类型推断