Scala中的部分应用程序不具有引用透明性?

Scala中的部分应用程序不具有引用透明性?,scala,functional-programming,Scala,Functional Programming,给定两个函数: 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> 这是类型推断器的问题还是某种预期行为?这只是一个语法错误,如果打开-Xprint:parser选项

给定两个函数:

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>

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

这只是一个语法错误,如果打开
-Xprint:parser
选项,您将看到表达式与正确表达式之间的差异,即:
(f(u:String,42))和第g

你的表情:

((x$1: String) => f((x$1: String), 42).andThen(g))
正确的答案是:

((x$1: String) => f((x$1: String), 42)).andThen(g)
你可以看到区别。这是因为扩展规则,scalac首先将语法规范化为点形式,然后扩展它。同样的规则也适用于这种形式的函数应用程序:
func(41;
,它被扩展到最里面的大括号,我不记得它在SLS中的什么地方写的

((x$1: String) => f((x$1: String), 42)).andThen(g)