Function reduce中的scala隐式类方法类型不匹配与使用函数curry的非隐式方法类型不匹配 问题:
关于隐式类的一些东西,混淆了reduce()。 当在隐式类中时,编译器会对reduce()第二个参数进行投诉。 但当相同的代码在非隐式方法中时,它可以编译并正常工作 关于隐式类,我遗漏了什么 代码: 将Function reduce中的scala隐式类方法类型不匹配与使用函数curry的非隐式方法类型不匹配 问题:,function,scala,currying,implicits,Function,Scala,Currying,Implicits,关于隐式类的一些东西,混淆了reduce()。 当在隐式类中时,编译器会对reduce()第二个参数进行投诉。 但当相同的代码在非隐式方法中时,它可以编译并正常工作 关于隐式类,我遗漏了什么 代码: 将MySeq[Int](val l:Seq[Int])替换为MySeq(val l:Seq[Int]) 编译器消息的解释: MySeq[Int]部分为名为Int的类MySeq定义了一个抽象类型参数,它(自动)是Any的子类,并对实际的scala.Int进行阴影处理。然后编译器尝试调用+任何实例的+方
MySeq[Int](val l:Seq[Int])
替换为MySeq(val l:Seq[Int])
编译器消息的解释:MySeq[Int]
部分为名为Int
的类MySeq
定义了一个抽象类型参数,它(自动)是Any
的子类,并对实际的scala.Int
进行阴影处理。然后编译器尝试调用+
任何实例的+
方法。它看到一个隐式类scala.Predef.any2stringad
的声明,该类有一个带有签名的方法def+(其他:String):String
,因此编译器认为+
的第二个参数应该是String,您需要去掉类型参数Int
<在隐式类中,code>Int
实际上不是类型Int
,而是一个自由类型参数,它隐藏了Int
的名称
产生这种神秘编译器错误的原因是,编译器正在从lambda\u+\ u
推断类型Any
(因为类型参数可以是任何东西),并假设+
将来自typeAny
上的toString
。如果将类声明中的Int
替换为T
,则会看到相同的错误
这将有助于:
implicit class MySeq(val l: Seq[Int]) {
final def mapSum(f: Int => Int): Int = {
l.map(x => f(x)).reduce(_ + _)
}
}
事实上,这与它的含蓄无关。如果只是一个常规的类
,则会出现相同的错误
原因是您声明了一个泛型类型:MySeq[Int]
,它恰好被称为Int
。所以当你说f:Int=>Int
时,你会想“哦,那是一个整数”,而编译器会想,“哦,那意味着你可以在那里填入任何类型!”。(将所有Int
s替换为A
,其工作原理相同。)
现在编译器处于绑定状态。什么+
可以应用于任何一对类型?您可以将任何内容转换为字符串
,并且+
是在字符串
上定义的。因此,当编译器意识到这种方法行不通时,您会收到一条非常误导性的错误消息
只要放下[Int]
,你所有的Int
实际上就是你认为它们的意思,隐式类版本就可以了。啊!这是有道理的。
implicit class MySeq(val l: Seq[Int]) {
final def mapSum(f: Int => Int): Int = {
l.map(x => f(x)).reduce(_ + _)
}
}