Scala类型推断不适用于类型边界,除非显式指定了类型

Scala类型推断不适用于类型边界,除非显式指定了类型,scala,function,scala-cats,Scala,Function,Scala Cats,我试图在scala like中围绕函数创建一个文档包装器,以便可以查询包装器中包含函数的文档,如下所示: trait WrappedFunction1[A, B] { def f : Function1[A, B] def doc: String def apply(x:A):B = f(x) def compose[C, T <:WrappedFunction1[B, C]](that:T):WrappedFunction1[A, C] = new Wrappe

我试图在scala like中围绕函数创建一个文档包装器,以便可以查询包装器中包含函数的文档,如下所示:

trait WrappedFunction1[A, B] {
  def f : Function1[A, B]
  def doc: String
  def apply(x:A):B = f(x)
  def compose[C, T <:WrappedFunction1[B, C]](that:T):WrappedFunction1[A, C] = 
    new Wrapper[A, C](this.f andThen that.f, this.doc + " composed with " + that.doc)
}

class Wrapper[A, B](f1:Function1[A, B], sos:String) extends WrappedFunction1[A, B] {
  val f = f1
  val doc = sos
}

object Wrapper {
  implicit class Wrap[A, B](f1:Function1[A, B]) {
    def wrap(sos:String):WrappedFunction1[A, B] = new Wrapper(f1, sos)
  }
}
但是,当我编写其中两个时,无法得到推断的类型:

val xy = x1 compose y1

cmd3.sc:1: inferred type arguments [Nothing,cmd3Wrapper.this.cmd1.cmd0.wrapper.WrappedFunction1[String,String]] do not conform to method compose's type parameter bounds [C,T <: cmd3Wrapper.this.cmd1.cmd0.wrapper.WrappedFunction1[String,C]]
val xy = x1 compose y1
            ^cmd3.sc:1: type mismatch;
 found   : cmd3Wrapper.this.cmd1.cmd0.wrapper.WrappedFunction1[String,String]
 required: T
val xy = x1 compose y1
                    ^
Compilation Failed
有什么地方我出了问题吗?
还有更好的方法吗?(我尝试了类型类,但它们似乎是为具有一个类型参数的特征定义的,可能还有其他代数数据类型吗?

问题在于Scala的类型推断的细节。它不能先推断
t
,然后再从中推断
C
;相反,它必须同时推断两者

中:T
它可以确定
T
,但是
C
在参数类型中没有提到,所以它被赋值
Nothing
,只有在下一步编译器才注意到它不适合。因此,解决方法是将类型更改为

def compose[C, T <:WrappedFunction1[B, C]](that: T with WrappedFunction1[B, C])
因为这已经允许传递
WrappedFunction1[B,C]
的任何子类型

val xy = x1 compose[String, WrappedFunction1[String, String]] y1
def compose[C, T <:WrappedFunction1[B, C]](that: T with WrappedFunction1[B, C])
def compose[C](that: WrappedFunction1[B, C])