Scala中的模式匹配时不正确的类型推断
在下面的ADT中,为什么对其类型参数Scala中的模式匹配时不正确的类型推断,scala,functional-programming,pattern-matching,algebraic-data-types,Scala,Functional Programming,Pattern Matching,Algebraic Data Types,在下面的ADT中,为什么对其类型参数s错误地推断出Foo 密封特征和[-S,+A] case类Foo[S]()扩展Sum[S,S] def execute[S,A](mqtt:Sum[S,A],S:S):A= mqtt匹配{ //对于Foo,S和A应该相同 case Foo()=>s//应编译,但返回错误。 } 斯卡斯蒂的链接 您正在使用两个不同的类型参数S和A调用方法execute,编译器没有证据表明它们是相同的 因此,当您尝试在方法签名需要A时返回类型为S的对象时,您会得到一个错误。这
s
错误地推断出Foo
密封特征和[-S,+A]
case类Foo[S]()扩展Sum[S,S]
def execute[S,A](mqtt:Sum[S,A],S:S):A=
mqtt匹配{
//对于Foo,S和A应该相同
case Foo()=>s//应编译,但返回错误。
}
斯卡斯蒂的链接
您正在使用两个不同的类型参数
S
和A
调用方法execute
,编译器没有证据表明它们是相同的
因此,当您尝试在方法签名需要A
时返回类型为S
的对象时,您会得到一个错误。这与ADT无关
如果您向编译器提供有关类型参数的更多详细信息,就可以使它正常工作。
例如,def execute[A,S我能够使用类型化模式匹配而不是构造函数模式匹配来解决这个问题
sealed trait Sum[-S, +A]
case class Foo[S]() extends Sum[S, S]
def execute[S, A](mqtt: Sum[S, A], s: S): A =
mqtt match {
case m : Foo[S] => s
}
@jwvh我添加了错误屏幕截图。@DmytroMitin yes在我的域
S
中被接受,并且A
在其他一些case类中被返回。@DmytroMitin有一个打字错误,对此表示抱歉。在case类Foo
上进行模式匹配时,编译器应该能够推断Sum[S,A]
实际上是Sum[S,S]
因此Foo[S]
?@tusharmath编译器无法推断,因为您可以调用execute[Int,String](??,1)
@tusharmath或execute[Int,String](null,1)
或execute[Int,String](新和[Int,String]{},1)
请注意,模式匹配发生在运行时,类型参数在编译时会被删除。根据您所做的工作,在更复杂的场景中可能会出现一些意外行为。@stefanobaghino是的,但模式内部的类型推断无论如何都会在编译时发生。类型擦除发生在编译时的erasure
阶段,它发生在推断类型的typer
阶段之后很久。我不是在争论,只是提到这不是全部。