加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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子表达式,后面的链接调用可能会引入约束,使系统不能令人满意。留下类型变量未解决的缺点是,闭包的类型推断需要知道目标类型,因此会失败(它需要一些具体的继续 – 闭包的必需类型和其参数类型的类型必须不是两者都是未知的)。

现在,当延迟解决约束使推理失败时,我们可以回溯,解决所有的类型变量,并重试,但是这是棘手的(可能是相当低效的)。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读