我是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