gpt4 book ai didi

scala - 使用 .toSet 制作的 Set 上的类型推断失败?

转载 作者:行者123 更新时间:2023-12-03 10:22:51 24 4
gpt4 key购买 nike

为什么类型推断在这里失败?

scala> val xs = List(1, 2, 3, 3)
xs: List[Int] = List(1, 2, 3, 3)

scala> xs.toSet map(_*2)
<console>:9: error: missing parameter type for expanded function ((x$1) => x$1.$times(2))
xs.toSet map(_*2)

但是,如果 xs.toSet被分配,它编译。
scala> xs.toSet
res42: scala.collection.immutable.Set[Int] = Set(1, 2, 3)

scala> res42 map (_*2)
res43: scala.collection.immutable.Set[Int] = Set(2, 4, 6)

另外,反过来,转换为 Set来自 List ,并映射到 List符合。
scala> Set(5, 6, 7)
res44: scala.collection.immutable.Set[Int] = Set(5, 6, 7)

scala> res44.toList map(_*2)
res45: List[Int] = List(10, 12, 14)

最佳答案

我同意推断“唯一可能”的类型会很好,即使调用是链接的,但存在技术限制。

您可以将推理视为对表达式的广度优先扫描,收集类型变量上的约束(由子类型边界和所需的隐式参数产生),然后解决这些约束。这种方法允许,例如,隐式来指导类型推断。在您的示例中,即使您只查看 xs.toSet 也只有一个解决方案子表达式,后面的链式调用可能会引入约束,使系统无法满足。不解决类型变量的缺点是闭包的类型推断需要知道目标类型,因此会失败(它需要一些具体的东西继续下去——所需的闭包类型和它的参数类型必须不是两者都是未知的)。

现在,当延迟求解约束导致推理失败时,我们可以回溯,求解所有类型变量,然后重试,但这很难实现(并且可能效率很低)。

关于scala - 使用 .toSet 制作的 Set 上的类型推断失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5544536/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com