什么是Scala 2.8规范§6.26.5Eta扩展中的“最大子表达式”?
发布时间:2020-12-16 18:51:00 所属栏目:安全 来源:网络整理
导读:在 Scala 2.8 language specification,§6.26.5EtaExpansion中,它声明我们需要一个最大的子表达式,但是,没有找到这个的定义.有人可以澄清一下吗? 解决方法 考虑以下: def list1 = { println("1st list!"); List(1,2,3) }def list2 = { println("2nd list!"
在
Scala 2.8 language specification,§6.26.5EtaExpansion中,它声明我们需要一个最大的子表达式,但是,没有找到这个的定义.有人可以澄清一下吗?
解决方法
考虑以下:
def list1 = { println("1st list!"); List(1,2,3) } def list2 = { println("2nd list!"); List(4,5) } def empty = { println("Empty string!"); "" } 然后: scala> val foo = (list1 ++ list2).foldLeft(empty) _ Empty string! 1st list! 2nd list! foo: ((String,Int) => String) => String = <function1> 这里(list1 list2).foldLeft(empty)是方法类型的表达式,list1 list2和empty是它的最大子表达式,它们只是字面上最大的组成表达式.我们正在使用_强制eta扩展,但在某些情况下这是不必要的. 有意义的是,我们不希望每次使用函数foo时都要对list1 list2进行求值,这就是§6.26.5中描述的转换完成的内容 – 它确保对子表达式进行求值和保存一次,在创建函数之前. 如果我们用-print启动REPL,我们已经看到了以下内容(为了清晰起见重新格式化): $read$$iw$$iw.this.foo = { <synthetic> val eta$0$1: String = $line5.$read$$iw$$iw.empty(); <synthetic> val eta$1$1: List = $line3.$read$$iw$$iw.list1().++( $line4.$read$$iw$$iw.list2(),immutable.this.List.canBuildFrom() ).$asInstanceOf[List](); { (new anonymous class anonfun$1(eta$0$1,eta$1$1): Function1) } }; 如果您想知道在给定情况下究竟是什么构成子表达式,这是一种简单的检查方法 – 只需查找以< synthetic>开头的行. VAL. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |