Scala中的部分应用程序不是引用透明的吗?

时间:2014-09-17 21:33:56

标签: scala functional-programming

有两个功能:

def f(a: String, b: Int): Int = a.length + b
val g: Int => String = _.toString

为什么我可以通过中间作业撰写部分应用的fg

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

这是类型推理器的问题还是某种预期的行为?

1 个答案:

答案 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中编写的内容。