Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function reduce中的scala隐式类方法类型不匹配与使用函数curry的非隐式方法类型不匹配 问题:_Function_Scala_Currying_Implicits - Fatal编程技术网

Function reduce中的scala隐式类方法类型不匹配与使用函数curry的非隐式方法类型不匹配 问题:

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进行阴影处理。然后编译器尝试调用+任何实例的+方

关于隐式类的一些东西,混淆了reduce()。 当在隐式类中时,编译器会对reduce()第二个参数进行投诉。 但当相同的代码在非隐式方法中时,它可以编译并正常工作

关于隐式类,我遗漏了什么

代码: 将
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
(因为类型参数可以是任何东西),并假设
+
将来自type
Any
上的
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(_ + _)
    }
 }