作爲計算機科學專業的學生,我的第二個任期幾乎是整個學期,我們專注於以不同的變化(棧,隊列......)編寫鏈表。這些列表的設計總是來到了這個鏈接列表單一班級vs多個班級
class List<T> {
class ListElement {
T value;
ListElement next;
}
ListElement root;
}
與變化,向其中實現的方法和他們如何工作(我在這裏爲了簡化,不構造和性能)。有一天,我開始學習scala並專注於函數式編程。這也到了一個鏈接列表被寫入的地方,但是在風格的實現中。
class List[T](head: T, tail: List[T])
儘管語法和不變性不同,但在我看來,這是另一回事。 我想我自己:「那麼你可以在C#或Java中用相同的方式實現列表,其中一個class
比你學到的知識要少。」
我可以看到你爲什麼會在功能性語言,其中遞歸還不如危險在C#或Java實現鏈表一樣,因爲至少我在思考一個遞歸執行的所有常用方法的方法這個設計的鏈表非常直觀。
我不明白的是,爲什麼C#或Java中的鏈表通常以第一種方式實現,而您可以用較少的代碼實現它們,但具有相同的冗長度?(我不是在談論語言庫中的列表實現,而是關於你通常寫作程序員的列表)
我可以看到第一種方法的唯一好處是你可以隱藏從用戶的實施更好一點,但這是這個原因,也是這個值得追加
我甚至不會需要我的實現暴露給用戶,作爲我仍然可以實現我的名單內不同,也許只選擇了有一個這樣的構造函數,並提供功能中檢索列表中的第一個元素作爲class
?
head
也其餘爲tail
。
假設沒有通用的可空性,在後一種情況下仍然需要多個類。 Scala解決它像[this](https://gist.github.com/rightfold/ef1faf5415655d3900c2)。 – rightfold
@rightfold這當然是真的,但理論上你可以將'tail'設置爲'null'或者在scala的情況下你可以使用'Option [List [T]]'。我知道使用'null'是不好的,但在C#世界中它似乎被廣泛接受(至少在我必須使用的代碼或聽說過的講座中)。同樣在第一種情況下,如果列表爲空,您還需要一個值來將root設置爲。 – mgttlinger
'Option'是一個類,所以你仍然有兩個類。 :) – rightfold