簡體   English   中英

Haskell:列表的基本數據結構是什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM