gpt4 book ai didi

function - scala foreach 和 map 初始化器

转载 作者:行者123 更新时间:2023-12-04 05:59:02 25 4
gpt4 key购买 nike

刚刚看到在 Scala 中为 foreach 或 map 等高阶函数初始化代码块的有趣可能性:

(1 to 3) map {
val t = 5
i => i * 5
}


(1 to 3) foreach {
val line = Console.readLine
i => println(line)
}

这是一些记录的功能还是我应该避免这样的结构?我可以想象,“初始化” block 进入构造函数,而闭包本身变成了 apply() 方法?

感谢 Pat 的原始问题 ( http://extrabright.com/blog/2010/07/10/scala-question-regarding-readline)

最佳答案

虽然使用的功能并不少见,但我承认这是一个相当奇怪的功能组合。基本技巧是 Scala 中的任何 block 都是一个表达式,其类型与 block 中的最后一个表达式相同。如果最后一个表达式是一个函数,这意味着该 block 具有函数类型,因此可以用作 "map"或 "foreach"的参数。在这些情况下发生的情况是,当调用“map”或“foreach”时,会评估 block 。该 block 计算为一个函数(在第一种情况下为 i=> i*5 ),然后将该函数映射到该范围内。

此构造的一种可能用途是让 block 定义可变变量,并且生成的函数在每次调用时都会改变变量。变量将被初始化一次,由函数关闭,并且每次调用函数时都会更新它们的值。

例如,这是计算前 6 个阶乘数的一种有点令人惊讶的方法

(1 to 6) map {
var total = 1
i => {total *= i;total}
}

(顺便说一句,很抱歉以阶乘为例。要么是那个,要么是斐波那契。函数式
编程公会规则。你有问题,在大厅里和男孩们一起讨论。)

让 block 返回函数的一个不太必要的原因是在 block 的早期定义辅助函数。例如,如果您的第二个示例是
(1 to 3) foreach {  
def line = Console.readLine
i => println(line)
}

结果将是读取三行并每行回显一次,而您的示例将行读取一次并回显三次。

关于function - scala foreach 和 map 初始化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3220687/

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