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)