Ich bin sowohl neu in Haskell als auch in der Programmierung. Meine Frage bezieht sich auf Binding in gemusterten, rekursiven Funktionen. Angenommen, ich habe eine Funktion, die überprüft, ob eine gegebene Liste (x:xs) eine Teilliste einer anderen Liste (y:ys) ist. Mein erster Gedanke, basierend auf den Beispielen in meinem Lehrbuch, war:
sublist [] ys = True
sublist xs [] = False
sublist (x:xs) (y:ys)
| x == y = sublist xs ys
| x /= y = sublist (x:xs) ys
Dies funktioniert mit Testdaten, z.B.,
sublist [1, 2, 3] [1, 2, 4, 1, 2, 3]
wo ich erwartet hatte, dass es scheitern würde. Ich erwarte, dass es scheitern wird, da
sublist [1, 2, 3] [1, 2, 4, 1, 2, 3]
= sublist [2, 3] [2, 4, 1, 2, 3]
= sublist [3] [4, 1, 2, 3]
an diesem Punkt, dachte ich, [3] = 3:[] wird mit (x:xs) in sublist abgeglichen, und [4, 1, 2, 3] wird mit (y:ys) in sublist abgeglichen. Wie funktioniert dann sublist?
Bearbeiten: Danke an alle hier, ich glaube, ich habe mein Problem gelöst. Wie festgestellt, wollte ich (subbewusst) dass sublist für mich zurückverfolgt. Unter Verwendung der letzten Antwort (BMeph) als Leitfaden habe ich mich entschieden, das Problem anders anzugehen, um das "Binding-Problem" zu lösen, d.h. das "Backtracking-Problem".
subseq :: (Eq a) => [a] -> [a] -> Bool
subseq [] _ = True
subseq _ [] = False
subseq (x:xs) (y:ys) =
-- subseq' entscheidet, ob die Liste, die an (x:xs) gebunden ist = M, ein Präfix der Liste
-- ist, die an L = (y:ys) gebunden ist; es rekursiert durch L und gibt einen Bool-Wert zurück. subseq
-- rekursiert durch M und L und gibt eine Disjunktion von Bool-Werten zurück.
-- Jeder rekursive Aufruf von subseq übergibt M und ys an subseq', der
-- entscheidet, ob M ein Präfix der **aktuelle Liste gebunden an ys** ist.
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