我有一些可變的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種選擇:
- 寫尾遞歸函數,硬着頭皮重構值處理代碼
- 使用一個懶惰的名單。這不是一個內存敏感的應用程序(雖然它是性能敏感)
- 想出一個新的方法。
我想我真正想要的是一個懶惰的評估序列,我可以在處理它們後丟棄這些值。有什麼建議麼?
n是n的函數嗎?n的函數還是比這個關係更復雜? – sblundy 2010-05-13 18:32:49
是的,n可以僅從d計算,但結果是非確定性的,並且相同的d不會總是產生相同的n。 – dbyrne 2010-05-13 18:46:59