Scala类型系统,找不到内联的公共祖先

Scala类型系统,找不到内联的公共祖先,scala,scala-cats,mockito-scala,Scala,Scala Cats,Mockito Scala,我在一个类型繁多的系统上,有些泛型方法声明为def execute]C 但我希望它能够将EitherT[F,SubOfA,B]翻译为EitherT[F,SubOfA.A[A],B] 保持不变意味着不可能以这种方式“翻译”:一个EitherT[F,SubOfA,B]根本不是一个EitherT[F,A,B] 现在,一个单独的问题是,尽管整个fail.asLeftT[Future,Seq[Receiver#E]]的类型是预期的,为什么fail的类型没有被推断为fail。答案是Scala类型的推理不是这

我在一个类型繁多的系统上,有些泛型方法声明为
def execute]C
但我希望它能够将
EitherT[F,SubOfA,B]
翻译为
EitherT[F,SubOfA.A[A],B]

保持不变意味着不可能以这种方式“翻译”:一个
EitherT[F,SubOfA,B]
根本不是一个
EitherT[F,A,B]

现在,一个单独的问题是,尽管整个
fail.asLeftT[Future,Seq[Receiver#E]]
的类型是预期的,为什么
fail的类型没有被推断为
fail
。答案是Scala类型的推理不是这样的;键入
expression.method(…)
时,它将首先键入
expression
,并且不能使用
方法的预期返回类型

您仍然可以内联编写它们,但需要类型归属:

(SubOfFail(): Fail).asLeftT[Future, Seq[Receiver#E]]
Seq
的情况下,显式类型参数也将起作用:

Seq[Event](SubOfEvent()).asRightT[Future, Fail]

我不知道表达式是先键入的,没有考虑方法的返回类型。但这是有道理的。感谢您的快速回答。基本上,如果不键入
表达式
,编译器将不知道要使用哪个
方法
,以及它的签名是什么(或者如果重载,则不知道签名)。
(SubOfFail(): Fail).asLeftT[Future, Seq[Receiver#E]]
Seq[Event](SubOfEvent()).asRightT[Future, Fail]