簡體   English   中英

2 個列表的串聯

[英]Concatenation of 2 lists

我將列表類型定義為
data List a = Empty | Entry a (List a)

我需要寫一個帶簽名的函數
appendList :: List a -> List a -> List a

看起來遞歸在這里可能很有用,但我不知道如何使用它

根據您的評論,您自己解決了大部分問題。

可能有幫助的(將來)是詳盡地查看數據構造函數的所有組合。 由於這里有兩個參數,並且每個這樣的List a都有兩個數據構造函數,因此我們可以寫成骨架:

appendList :: List a -> List a -> List a
appendList Empty Empty = …
appendList Empty (Entry x xs) = …
appendList (Entry x xs) Empty = …
appendList (Entry x xs) (Entry y ys) = …

現在我們可以對這些情況進行推理了。 如果兩個列表都是Empty ,那么結果也是一個Empty列表。 如果第一個列表是Empty ,第二個是非空的,那么我們返回第二個列表。 如果第一個列表非空,第二個列表為空,那么我們返回第一個列表。 最后,如果兩個列表都非空,我們創建一個列表,該列表將產生第一個列表的第一項,並在第一個列表的尾部和第二個列表上遞歸。

所以我們可以通過以下方式實現:

appendList :: List a -> List a -> List a
appendList Empty Empty = Empty
appendList Empty (Entry x xs) = (Entry x xs)
appendList (Entry x xs) Empty = (Entry x xs)
appendList (Entry x xs) (Entry y ys) = (Entry x (appendList xs (Entry y ys)))

我們現在可以壓縮這些子句。 例如,可以通過簡單地返回第二個列表來解析第一個 two 子句。 第三個和第四個子句可以壓縮為Entry x (AppendList xs ya) ,其中ya是第二個參數:

appendList :: List a -> List a -> List a
appendList Empty ya = ya
appendList (Entry x xs) ya = (Entry x (appendList xs ya))

或者我們可以通過以下方式使其更緊湊:

appendList :: List a -> List a -> List a
appendList Empty = id
appendList (Entry x xs) = Entry x . appendList xs

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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