Я новичок в Haskell и программировании. Мой вопрос о связывании в рекурсивных функциях с сопоставлением с шаблоном. Например, предположим, что у меня есть функция, которая проверяет, является ли данный список (x: xs) подсписком другого списка (y: ys). Моя первоначальная мысль, следуя примерам из моего учебника, была:
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: [] будет сопоставлено с (x: xs) в подсписке, а [4, 1, 2, 3] будет сопоставлено с (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