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