Scala 如何修复上限类型上的多态性表达式错误
我对无法识别类型的隐式转换有问题。我伪造了最小的(非)工作示例,以使事情变得清楚。但我仍然无法理解为什么我的代码被拒绝,以及我应该如何重写它Scala 如何修复上限类型上的多态性表达式错误,scala,Scala,我对无法识别类型的隐式转换有问题。我伪造了最小的(非)工作示例,以使事情变得清楚。但我仍然无法理解为什么我的代码被拒绝,以及我应该如何重写它 trait AnyK[X] trait Simple[X, U[_]] trait Knot[X, U[_ <: X]] def simple[X, U[_]] = new Simple[X, U] {} def knot[X, U[_ <: X]] = new Knot[X, U] {} val pass : Simple[Any, A
trait AnyK[X]
trait Simple[X, U[_]]
trait Knot[X, U[_ <: X]]
def simple[X, U[_]] = new Simple[X, U] {}
def knot[X, U[_ <: X]] = new Knot[X, U] {}
val pass : Simple[Any, AnyK] = simple
val fail : Knot[Any, AnyK] = knot
val passNow : Knot[Any, AnyK] = knot[Any, AnyK]
更新 由于还不清楚,我举了一个稍微复杂一点的例子来说明为什么含蓄会让事情变得更难
trait AnyK[X]
trait Simple[X, U[_]]
trait Knot[X, U[_ <: X]]
implicit def simple[X, U[_]] = new Simple[X, U] {}
implicit def knot[X, U[_ <: X]] = new Knot[X, U] {}
val pass = implicitly[Simple[Any, AnyK]]
val fail = implicitly[Knot[Any, AnyK]]
所呈现的错误消息的描述性远不如我上面所描述的。这就是为什么我在原始示例中避免使用隐式
我对无法识别类型的隐式转换有问题
很难说,因为您的最小示例不包含任何隐式转换
当您不使用类型参数注释knot
时,编译器显然无法正确地推断它们(有时编译器在推断更高级类型时会遇到问题)
但是当你显式地注释它们时,一切都起作用了
val passNow : Knot[Any, AnyK] = knot[Any, AnyK]
所以,只要在必要时对它们进行注释
我对无法识别类型的隐式转换有问题
很难说,因为您的最小示例不包含任何隐式转换
当您不使用类型参数注释knot
时,编译器显然无法正确地推断它们(有时编译器在推断更高级类型时会遇到问题)
但是当你显式地注释它们时,一切都起作用了
val passNow : Knot[Any, AnyK] = knot[Any, AnyK]
所以只要在必要时注释它们。我提到隐式是为了表明我不能注释类型,因为它们应该隐式推断。像
隐式[Knot[Any,AnyK]]
应该自动选择隐式方法Knot
@ayvango感谢您的澄清。不幸的是,我对隐式转换是否有效持悲观态度。你能提供更多的上下文吗?为什么在你的情况下,类型构造函数U不能接受一个不是X的子类型的类型很重要?我正在为更高级的类型实现类型级别列表TListK
应该接受像Seq
、Set
、选项等类型。但在最一般的形式中,它还应该与接受给定类型的子类型的类型一起工作。我有很多这样的类型,比如trait解释器
,可以解释脚本
的任何子类型,现在我切换到trait Limit{type Param;type Kind[P@DmytoMitin最近我问了很多类型级别的问题。现在不是元问题的时候。我如何确定某些行为是bug还是特性?我应该什么时候用问题通知单打扰scala开发人员,什么时候不应该?我提到隐式是为了表明我不能注释类型,因为它们应该隐式推断。比如隐式[结[任何,任何]]
应该自动选择隐式方法knot
@ayvango感谢您的澄清。不幸的是,我对隐式转换是否有效持悲观态度。您能否提供更多的上下文,说明为什么类型构造函数U不能接受非X子类型的类型很重要?我正在实现t更高级类型的类型级别列表。TListK
应该接受像Seq
,Set
,Option
这样的类型。但是在最一般的形式中,它也应该与接受给定类型的子类型一起工作。我有很多这样的类型,比如trait解释器
,可以解释Scr的任何子类型ipt
目前,我切换到trait Limit{type Param;type Kind[P@DmytoMitin]最近我问了很多类型级别的问题。现在不是提出元问题的时候。我如何确定某些行为是bug还是特性?我应该在什么时候向scala开发人员发出问题通知单,什么时候不是?
val fail : Knot[Any, AnyK] = knot
val passNow : Knot[Any, AnyK] = knot[Any, AnyK]