有两个功能:
def f(a: String, b: Int): Int = a.length + b
val g: Int => String = _.toString
为什么我可以通过中间作业撰写部分应用的f
和g
:
val f_ = f(_: String, 42)
f_ andThen g
// String => String = <function1>
但不是直接:
f(_: String, 42) andThen g
// error: value andThen is not a member of Int
这是类型推理器的问题还是某种预期的行为?
答案 0 :(得分:5)
这只是一个语法错误,如果您打开-Xprint:parser
选项,您会看到表达式与正确表达式之间的差异,即:(f(_: String, 42)) andThen g
。
你的表达:
((x$1: String) => f((x$1: String), 42).andThen(g))
正确的一个:
((x$1: String) => f((x$1: String), 42)).andThen(g)
你可以看到差异。这是因为扩展规则,scalac首先将语法规范化为点形式,然后展开它。同样的规则也适用于这种形式的函数应用程序:func(_)
扩展到最内部的括号,我不记得在SLS中编写的内容。