我是Haskell和編程的新手。我的問題綁定模式匹配,遞歸函數。例如,假設我有一個函數來檢查給定列表(x:xs)是否是另一個列表的子列表(y:ys)。我最初的想法,按照我的書的例子,是:Haskell - 模式匹配和遞歸
sublist [] ys = True
sublist xs [] = False
sublist (x:xs) (y:ys)
| x == y = sublist xs ys
| x /= y = sublist (x:xs) ys
這部作品的測試數據,例如,
sublist [1, 2, 3] [1, 2, 4, 1, 2, 3]
,我希望它失敗。我希望它失敗,因爲
sublist [1, 2, 3] [1, 2, 4, 1, 2, 3]
= sublist [2, 3] [2, 4, 1, 2, 3]
= sublist [3] [4, 1, 2, 3]
在這一點,我想,[3] = 3:在子列表[4,1,2,3,和:[]下面將(XS x)的匹配]將在子列表中與(y:ys)匹配。那麼,子列表是如何工作的呢?
編輯:感謝這裏的每個人,我想我已經解決了我的問題。如前所述,我是(「潛意識」)想要子列表爲我回溯。使用最後回答(BMeph)作爲指導,我決定以不同的方式解決問題,以解決「綁定問題」,即「回溯」問題。
subseq :: (Eq a) => [a] -> [a] -> Bool
subseq [] _ = True
subseq _ [] = False
subseq (x:xs) (y:ys) =
-- subseq' decides whether the list bound to (x:xs) = M is a prefix of the list
-- bound to L = (y:ys); it recurses through L and returns a Bool value. subseq
-- recurses through M and L, returning a disjunction of Bool
-- values. Each recursive call to subseq passes M and ys to subseq', which
-- decides whether M is a prefix of the **current list bound to ys**.
let subseq' :: (Eq a) => [a] -> [a] -> Bool
subseq' [] _ = True
subseq' _ [] = False
subseq' (x:xs) (y:ys) = (x == y) && subseq' xs ys
in subseq' (x:xs) (y:ys) || subseq (x:xs) ys
目前尚不清楚,什麼是失敗,你的預期失敗是什麼。 在你的例子中,[3]是[4,1,2,3]的一個子列表,所以會匹配。我想這不是你想要的。 – mb14 2010-07-09 13:51:41
編程和Haskell開始新手?我尊重!當你看到命令式編程中的其他人必須編寫代碼時,你正處於一個痛苦的世界。 :P – wheaties 2010-07-09 14:24:36
對不起,我應該已經更清楚了:我期望函數不能做我想做的事情,那就是:查找一個特定的序列,例如(1:2:3:[])是否出現在列表中,例如(4:1:2:[])。間接地,我問了如何讓我的「子列表」函數重新啓動原始(x:xs)綁定一次(x/= y)評估爲True。 – danportin 2010-07-09 16:59:01