est*_*lua 2 functional-programming scala
有两个功能:
def f(a: String, b: Int): Int = a.length + b
val g: Int => String = _.toString
Run Code Online (Sandbox Code Playgroud)
为什么它,我可以组成一个部分地施加f与g通过中间分配的手段:
val f_ = f(_: String, 42)
f_ andThen g
// String => String = <function1>
Run Code Online (Sandbox Code Playgroud)
但不是直接:
f(_: String, 42) andThen g
// error: value andThen is not a member of Int
Run Code Online (Sandbox Code Playgroud)
这是类型推理器或某种预期行为的问题吗?
这只是一个语法错误,如果你打开-Xprint:parser选项,你会看到你的表达与正确的表达之间的区别,即:(f(_: String, 42)) andThen g.
你的表达:
((x$1: String) => f((x$1: String), 42).andThen(g))
Run Code Online (Sandbox Code Playgroud)
正确的:
((x$1: String) => f((x$1: String), 42)).andThen(g)
Run Code Online (Sandbox Code Playgroud)
你可以看到差异.这是因为扩展规则,scalac首先将语法规范化为点形式,然后展开它.同样的规则也适用于这种形式的函数应用程序:func(_)它扩展到最内部的括号,我不记得在SLS中编写的内容.