2014-03-07 28 views
3

我一直在使用Scala進行一段時間的實驗,並經常遇到一些建議以支持不可變的數據結構。在慣用的Scala中更新大型數據結構

但是,當你有像例如3D場景圖中,一個大的神經網絡,或任何與需要頻繁的更新(在動畫場景中的物體,訓練神經網絡,...),相當多的對象,這似乎是

  1. 因爲你需要不斷地重新創建整個對象圖,並且由於當你需要更新一些對象的引用時,你不能僅僅調用setters,而是你需要複製對象圖並用更新的對象替換舊對象。

在慣用斯卡拉中如何處理這樣的事情?

+0

1.不可變數據結構通常允許更新而不復制整個數據。 2.你有沒有聽說過鏡頭? (可能相關:http://stackoverflow.com/questions/3900307/cleaner-way-to-update-nested-structures) –

+1

@GáborBakos1.實際上,這樣的結構是不可變數據結構的子集,並被命名爲[persistent]( https://en.wikipedia.org/wiki/Persistent_data_structure)以及一些內置的scala系列產品是持久的(例如List)2.即使鏡頭是魔術棒,沒有正確的拼寫*使用鏡頭*有點無用提示 –

+0

@ om-nom-nom感謝您的評論。我希望堆棧溢出鏈接提供瞭如何使用鏡頭的想法。我真的很好奇,鏡頭不適合她/他或只是未知。我希望我的評論不是在進攻中制定的,在這種情況下,我表示歉意。 –

回答

4

斯卡拉是多範型:面向對象和功能,可變和不可變。

複雜圖形是數據結構的一個例子,正如您已經確定的那樣,在可變上下文中使用可能更容易。如果是這樣,使數據結構可變。

習慣性斯卡拉是使用正確的範例來解決您的問題。

+0

問題是如何找到正確的範例。它是否真的很簡單,「不變性似乎讓事情變得困難,我會回到可變數據結構」?我剛剛發現http://stackoverflow.com/questions/9891522,它有一個答案,提到的想法,即圖結構不一定需要直接表示爲對象圖(其中連接由對象之間的引用表示)。事實上,如果一個邊只是一個參照2個節點的'Set'中的一個對象,更新它就意味着替換'Set'中的那個對象。 – herman

+0

@herman - 任何難以更新的不可變對象都可以被具有唯一ID的獨立對象雲和所有存儲在不可變集合中的實際指針所替代。有時候這很有幫助。有時這是一個很大的麻煩,沒有額外的好處。這究竟取決於細節。如果不可變性過於困難(或緩慢),您應該回歸到可變性,但這不是很好,尤其是如果您不需要不變性可提供的優勢(除了基線「更難在腳下拍攝自己「的優勢)。 –

相關問題