我正在嘗試從輸入中合并 2 個串列,但每次都出現錯誤。這是我的代碼:
myAppend :: [a] -> [a] -> [a]
myAppend a b = zipWith ( ) a b
收到此錯誤:“沒有因使用 ' ' 而導致 (Num a) 的實體”
我得到了這個解決方案,但它對我來說真的沒有意義
myAppend :: [a] -> [a] -> [a]
myAppend [] xs = xs
myAppend (y:ys) xs = y:(myAppend ys xs)
我真的不明白第二行和第三行。
任何人都可以幫忙嗎?
謝謝
uj5u.com熱心網友回復:
您myAppend沒有連接兩個串列,它旨在對兩個串列進行元素求和,因此myAppend [1,4,2,5] [1,3,0,2]會產生[2,7,2,7]. 它將需要一個Num a約束,因為它只有在串列的元素是Numbers 時才能作業:
myAppend :: Num a => [a] -> [a] -> [a]
myAppend a b = zipWith ( ) a b
至于這里的解決方案,它使用遞回。Haskell 中的串列類似于鏈表:你有一個由資料建構式表示的空串列(“ nil ”)[]和一個節點(“ cons ”),它用指向第一項的(x:xs)where表示,并指向剩余元素的串列。所以是.xxs[1,4,2,5](1:(4:(2:(5:[]))))
如果我們想追加[1,4],因此我們想從and[2,5]中生成一個串列。這意味著我們創建了一個包含第一個串列的所有元素的鏈表,但是我們讓它指向第二個串列的剩余元素,而不是指向空串列。我們通過遞回來做到這一點:(1:(4:(2:(5:[]))))(1:(4:[]))(2:(5:[]))[]
myAppend (y:ys) xs = y : myAppend ys xs
如果第一個串列與(y:ys)模式一致,則將匹配。在這種情況下,我們因此生成一個帶有yas 第一個元素的串列,并將 as 的結果myAppend ys xs作為剩余元素的串列(“tail”)。最終我們將因此呼叫myAppend ys xs空串列[]作為第一項。在這種情況下,我們因此回傳第二個串列而不是空串列,以將第二個串列附加到它。
因此,我們進行如下呼叫:
myAppend [1, 4] [2, 5]
= myAppend (1:(4:[])) (2:(5:[]))
-> 1 : (myAppend (4:[]) (2:(5:[])))
-> 1 : (4 : (myAppend [] (2:(5:[]))))
-> 1 : (4 : (2:(5:[]))
= [1, 4, 2, 5]
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/530870.html
標籤:列表哈斯克尔级联
