Scala强调语法和更高阶函数

时间:2014-05-03 20:25:43

标签: scala syntax anonymous-function higher-order-functions

我很难理解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,那么为什么类型问题仅在我明确声明类型之后才浮出水面?

让我感到困惑。

1 个答案:

答案 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和“占位符语法”子点,以查找有关如何解析下划线的更详细说明。