![](/img/trans.png)
[英]Program Structure — Simple Commandline To Do List App — What's the Haskell way?
[英]Haskell: What's the underlying data structure for list?
如果是鏈表,為什么它不支持push_back?
如果只是數組,為什么下標訪問時需要線性時間?
感謝您的幫助。
編輯:我們可以將元素添加到像這樣的列表的前面1:[2,3]
,即push_front;。 但是我們不能這樣做: [2,3]:4
,就是push_back。
ps。 實際上我是從C ++的STL借來的push_front / back
Haskell列表是單鏈接列表。 它支持追加到列表的末尾,但是必須遍歷整個列表才能執行此操作:
λ> let x = [1,2,3]
λ> x ++ [4]
[1,2,3,4]
如果通過push_back
表示在末尾添加一個元素,那么它當然“支持”它。 要將元素x
添加到列表list
(並獲取如此構造的新列表),請使用表達式list ++ [x]
。
但是請注意,這是一個O(n)操作,n是list
的長度。
那是因為它是一個單鏈表。 它還回答您有關下標的其他問題。
由於該問題詢問“基礎實施”:
列表類型(在概念上)定義如下:
data [a] = [] | a:[a]
您實際上不能編寫此聲明,因為列表具有時髦的語法。 但是你自己可以做同樣的事情
data List a = Nil | a :* List a
infixr 5 :*
當您編寫類似[1,2,3]
,這只是1:2:3:[]
特殊語法。 由於:
關聯到右邊,因此實際上意味着1:(2:(3:[]))
。 從根本上說,列表上的函數全部基於模式匹配,而模式匹配一次只處理一個構造函數。 您可能必須打開很多:
構造函數才能到達列表的末尾,然后構建一堆:
構造函數以將新版本放在一起並在末尾添加一個額外的元素。 您可能使用的任何函數(例如++
)最終都會在內部經歷這種過程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.