Scala类型推断不适用于类型边界,除非显式指定了类型
我试图在scala like中围绕函数创建一个文档包装器,以便可以查询包装器中包含函数的文档,如下所示: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
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])