什么是Scala 2.8规范§6.26.5Eta扩展中的"最大子表达式"?

Fel*_*lix 6 scala type-inference expansion language-specifications

Scala 2.8语言规范,§6.26.5EtaExpansion中,它声明我们需要一个最大子表达式,但是,没有找到这个的定义.有人可以澄清一下吗?

Tra*_*own 4

考虑以下:

\n\n
def list1 = { println("1st list!"); List(1, 2, 3) }\ndef list2 = { println("2nd list!"); List(4, 5) }\ndef empty = { println("Empty string!"); "" }\n
Run Code Online (Sandbox Code Playgroud)\n\n

进而:

\n\n
scala> val foo = (list1 ++ list2).foldLeft(empty) _\nEmpty string!\n1st list!\n2nd list!\nfoo: ((String, Int) => String) => String = <function1>\n
Run Code Online (Sandbox Code Playgroud)\n\n

这里(list1 ++ list2).foldLeft(empty)是方法类型的表达式, 和list1 ++ list2empty它的最大子表达式,它们实际上就是它的最大组成表达式。我们正在使用_强制 eta 扩展,但在某些情况下这是没有必要的。

\n\n

例如,我们不希望list1 ++ list2每次使用该函数时都进行评估foo,这是有道理的,这就是 \xc2\xa76.26.5 中描述的转换完成的\xe2\x80\x94,它确保在创建函数之前,子表达式将被计算并保存一次。

\n\n

如果我们使用 启动 REPL -print,我们会看到以下内容(为了清晰起见,重新格式化):

\n\n
$read$$iw$$iw.this.foo = {\n  <synthetic> val eta$0$1: String = $line5.$read$$iw$$iw.empty();\n  <synthetic> val eta$1$1: List = $line3.$read$$iw$$iw.list1().++(\n    $line4.$read$$iw$$iw.list2(),\n    immutable.this.List.canBuildFrom()\n  ).$asInstanceOf[List]();\n  {\n    (new anonymous class anonfun$1(eta$0$1, eta$1$1): Function1)\n  }\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您想知道在给定情况下子表达式到底是什么构成,这是检查\xe2\x80\x94的简单方法,只需查找以 开头的行<synthetic> val

\n