gpt4 book ai didi

scala - Scala 2.8 规范§6.26.5 Eta 扩展中的 "Maximal Sub-expression"是什么?

转载 作者:行者123 更新时间:2023-12-04 15:22:58 24 4
gpt4 key购买 nike

Scala 2.8 language specification ,第 6.26.5 节 Eta 扩展,它指出我们需要一个最大子表达式,但是,找不到它的定义。有人可以澄清这一点吗?

最佳答案

考虑以下:

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 ++ list2empty是它的最大子表达式,它们只是字面上最大的组成表达式。我们正在使用 _强制 eta 扩展,但在某些情况下这不是必需的。

我们不想要 list1 ++ list2 是有道理的每次我们使用函数 foo 时都会被评估,例如,这就是 §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 开头的行即可。 .

关于scala - Scala 2.8 规范§6.26.5 Eta 扩展中的 "Maximal Sub-expression"是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20969772/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com