Soy nuevo en Haskell y la programación. Mi pregunta sobre vinculante en el patrón de coincidencia, funciones recursivas. Por ejemplo, supongamos que tengo una función que verifica si una lista dada (x: xs) es una sublista de otra lista, (y: ys). Mi idea inicial, siguiendo los ejemplos en mi libro de texto, era:Haskell - Patrón de coincidencia y recursión
sublist [] ys = True
sublist xs [] = False
sublist (x:xs) (y:ys)
| x == y = sublist xs ys
| x /= y = sublist (x:xs) ys
Esto funciona en los datos de prueba, por ejemplo,
sublist [1, 2, 3] [1, 2, 4, 1, 2, 3]
donde esperaba que falle. Espero que falle, ya
sublist [1, 2, 3] [1, 2, 4, 1, 2, 3]
= sublist [2, 3] [2, 4, 1, 2, 3]
= sublist [3] [4, 1, 2, 3]
momento en el que, pensé, [3] = 3: [] se combina con (x: xs) en sublista, y [4, 1, 2, 3 ] se combinará con (y: ys) en la sublista. ¿Cómo, entonces, está funcionando la sublista?
Edit: Gracias a todos los presentes, creo que he resuelto mi problema. Como noté, estaba ("subconscientemente") queriendo que la sublista me retractara. Utilizando la última respuesta (BMeph) publicada como guía, decidí abordar el problema de manera diferente, para resolver el "problema vinculante", es decir, el problema de "retroceso".
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
no está claro, lo que está fallando y qué ¿Se espera que fallar. En su ejemplo, [3] es una sublista de [4,1,2,3] por lo que coincidirá. Supongo que eso no es lo que quieres. – mb14
¿Nuevo en la programación y comenzando con Haskell? ¡Respeto eso! Estás en un mundo de dolor cuando ves cómo el resto de nosotros en programación imperativa tenemos que escribir código. : P – wheaties
Lo siento, debería haber sido más claro: esperaba que la función no hiciera lo que quería, que era: encontrar si una secuencia particular, por ejemplo, (1: 2: 3: []), aparece en una lista, por ejemplo, (4: 1: 2: []), en ese orden. Indirectamente, estaba preguntando cómo hacer que mi función de "sublista" se reinicie en el enlace original (x: xs) una vez (x/= y) evaluado en Verdadero. – danportin