【发布时间】:2018-09-20 16:38:16
【问题描述】:
我有:
sealed trait Par[A]{def foo = ???}
case class Unit[A](v: () => A) extends Par[A]
case class Map2[L, R, A](parLeft: Par[L],
parRight: Par[R],
map: (L, R) => A) extends Par[A]
我的问题是,当我在p:Par[A] 上进行模式匹配以执行以下操作时:
def getSequentially: A = this match {
case Par.Unit(f) => f()
case Par.Map2(a, b, f) => f(a.getSequentially, b.getSequentially)
}
L 和 R 在 Intellij 的类型检查器中被推断为 Any,getSequentially 调用以红色突出显示,警告:type mismatch, expected Nothing, actual Any,因为 f 预计为:@987654330 @。虽然它实际上可以运行和编译。
我想我理解问题所在,我应该能够使用Map2 定义中的存在类型来解决它。唯一的问题是 map 参数有一个依赖类型,所以我不知道该怎么做。也许我应该做一个 AUX 模式的变体?
我的问题是,首先它为什么会编译,其次,是否有办法重组类型依赖关系,使其不再发出警告。
【问题讨论】:
标签: scala type-inference existential-type type-deduction