在遵循一些關於Scala的教程時,想到了這個問題,但是我認爲在函數式編程方面通常會很有趣。FP中的不可變狀態
我不確定FP中不可變性的重要性。我可以想到2種不同的情況:
1)類方法不會返回實際字段,而是返回它們的副本。例如,如果我們有一個類犬,我們需要保持不變,那麼它的功能:代替
getToys() { return new ArrayList(this.toys); }
:
getToys() { return this.toys; }
這種情況使我感覺良好,在第二種情況的客戶端代碼實際上可能會腐蝕物體。我懷疑在於第二種情況:
2)在Scala和大多數其它FP語言,我們喜歡一個遞歸調用:
sum(x: List[Int], acc: Int) {
if(x.isEmpty) return acc;
sum(x.tail, acc + x.head);
}
對傳統的for循環遞增的蓄電池。推理是這個累加器是一個可變變量。
該變量永遠不會暴露在函數之外,爲什麼要關心使它不可變?
編輯:
這似乎是最重要的最佳做法是引用透明 並沒有嚴格的不變性,意思大致是,我們不只要關心可變的狀態,因爲它不是由客戶端代碼發現。然而人們仍然聲稱,即使可變狀態影響局部變量(如我的第一個示例),代碼更具可讀性或更容易推理。
我個人認爲循環比遞歸更具可讀性。
所以真正的問題是:爲什麼使用不可變變量的代碼被認爲更容易閱讀/推理?
關於1)要點是,如果您的數據結構首先是不可變的,則不需要返回副本。 – sepp2k
[掌握不可變數據結構]的可能重複(http://stackoverflow.com/questions/8346119/a-grasp-of-immutable-datastructures) –
索引變量通常不會暴露,你是對的。只要我們談論僅用於迭代的簡單索引,我們就可以保存。這仍然不僅僅是一個最佳實踐,因爲這是您可以安全使用全局索引的唯一方式,並且仍然是線程保存。 – Julian