scala – 类型推理失败使用.toSet设置?
发布时间:2020-12-16 09:47:04 所属栏目:安全 来源:网络整理
导读:为什么类型推理失败在这里? scala val xs = List(1,2,3,3)xs: List[Int] = List(1,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> val xs = List(1,2,3,3) xs: List[Int] = List(1,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,3) scala> res42 map (_*2) res43: scala.collection.immutable.Set[Int] = Set(2,4,6) 另外,换句话说,转换为从列表设置,并在列表上映射。 scala> Set(5,6,7) res44: scala.collection.immutable.Set[Int] = Set(5,7) scala> res44.toList map(_*2) res45: List[Int] = List(10,12,14) 解决方法
我同意这是很好的推断“唯一可能的”类型,即使在呼叫被链接,但有技术限制。
您可以将推理视为对表达式进行广度优先扫描,从类型变量中收集约束(其来自子类型边界和必需的隐式参数),然后解决这些约束。该方法允许例如暗示引导类型推断。在你的例子中,即使有一个解决方案,如果你只看xs.toSet子表达式,后面的链接调用可能会引入约束,使系统不能令人满意。留下类型变量未解决的缺点是,闭包的类型推断需要知道目标类型,因此会失败(它需要一些具体的继续 – 闭包的必需类型和其参数类型的类型必须不是两者都是未知的)。 现在,当延迟解决约束使推理失败时,我们可以回溯,解决所有的类型变量,并重试,但是这是棘手的(可能是相当低效的)。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |