加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

什么是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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读