gpt4 book ai didi

scala - 最佳功能方法

转载 作者:行者123 更新时间:2023-12-01 09:09:26 27 4
gpt4 key购买 nike

我有一些可变的 scala 代码,我正试图以更实用的风格重写它们。这是一段相当复杂的代码,所以我试图将其重构。我的第一个想法是:

def iterate(count:Int,d:MyComplexType) = {
//Generate next value n
//Process n causing some side effects
return iterate(count - 1, n)
}

iterate(2000000,initialValue)

这对我来说似乎根本不起作用,因为我的代码中仍然混杂着副作用。我的第二个想法是:

def generateStream(d:MyComplexType):Stream[MyComplexType] = {
//Generate next value n
return Stream.cons(n, generateStream(n))
}

for (n <- generateStream(initialValue).take(2000000)) {
//process n causing some side effects
}

这对我来说似乎是一个更好的解决方案,因为至少我已将我的函数式值生成代码与可变值处理代码隔离开来。但是,这样的内存效率要低得多,因为我正在生成一个不需要存储的大列表。

这让我有 3 个选择:

  1. 编写一个尾递归函数,咬紧牙关重构值处理代码
  2. 使用惰性列表。这不是内存敏感型应用(尽管它对性能敏感)
  3. 想出一种新方法。

我想我真正想要的是一个惰性求值的序列,我可以在处理完这些值后丢弃它们。有什么建议吗?

最佳答案

请记住,性能关键型算法通常在可变时效果更好。所以要小心过早的去优化!

在 Scala 2.8 中,您可以使用 Iterator.iterate 创建一个没有存储值的无限序列。但我不确定这是否是重构代码以使其更具功能性的关键步骤。棘手的是“处理具有副作用的数据”部分。

你可以把整个东西放到迭代 block 中:

Iterator.iterate(initialState)(x => {
// create a new state based upon state x
}).drop(2000000).next

您现在通过顺序修改初始状态定义了一个无限处理流。您丢弃前 2000000 个值(其中一个是初始值),然后获取下一个(这是第 2000000 个生成的值)。尝试使用 0 和 x=>x+1 来查看它的实际效果。

关于scala - 最佳功能方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2829147/

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