Fel*_*lix 6 scala type-inference expansion language-specifications
在Scala 2.8语言规范,§6.26.5EtaExpansion中,它声明我们需要一个最大子表达式,但是,没有找到这个的定义.有人可以澄清一下吗?
考虑以下:
\n\ndef 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\nscala> 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 ++ list2
是empty
它的最大子表达式,它们实际上就是它的最大组成表达式。我们正在使用_
强制 eta 扩展,但在某些情况下这是没有必要的。
例如,我们不希望list1 ++ list2
每次使用该函数时都进行评估foo
,这是有道理的,这就是 \xc2\xa76.26.5 中描述的转换完成的\xe2\x80\x94,它确保在创建函数之前,子表达式将被计算并保存一次。
如果我们使用 启动 REPL -print
,我们会看到以下内容(为了清晰起见,重新格式化):
$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
。