我很难理解scala编译器。我将三个高阶函数传递给这样的超类:
... extends Arithmetic(Math.pow(-_,_), Math.log(_)/Math.log(_), Math.pow(_,_))
第一个函数没有编译,最后一个函数编译,唯一的区别是减号。编译器发出以下警告:
error: wrong number of parameters; expected = 2
令人困惑,因为有两个下划线。我可能不得不放弃下划线语法,但我想了解为什么会发生这种情况。我也试过
Math.pow(0-(_),_) Math.pow(0.-(_),_) Math.pow(0.0.-(_),_)
都给出了同样的错误。最后
Math.pow(-(_:Double),_:Double)
发出新错误
error: type mismatch;
found : Double => Double
required: Double
看起来更像是一个实际错误,而不是我违反语法。现在我的下一个想法是,"显然,如果其他人中有函数,则下划线语法不起作用#34;。但是看看第二个函数Math.log(_) / Math.log(_)
,据我所知转换为Math.log(_)./(Math.log(_))
并进行编译,这没有任何意义,因为这里将部分应用的log
函数传递给{{1 }}
此外,在超类./(...)
中定义的函数的预期类型是Arithmetic
,那么为什么类型问题仅在我明确声明类型之后才浮出水面?
让我感到困惑。
答案 0 :(得分:1)
Math.pow(_,_)
表示(x,y) => Math.pow(x,y)
,而Math.pow(-_,_)
表示y => Math.pow(x => -x,y)
。 Math.log(_)/Math.log(_)
是一个中缀方法调用,它与Math.log(_)./(Math.log(_))
相同,因此与(x,y) => Math.log(x)./(Math.log(y))
相同。
请参阅第21章“函数/函数文字”中的StackOverflow Scala Tutorial和“占位符语法”子点,以查找有关如何解析下划线的更详细说明。