7

Quiero definir mi propio operador infijo utilizando Haskell que concatena dos cadenas juntas. Sin embargo, quiero incluir una cláusula adicional en la que el operador concatute sobre los elementos superpuestos en ambas cadenas. Así que un ejemplo seríaConcat dos cadenas juntas

"eagle" myinfix "eagleeyes" = "eagleeyes" 
"water" myinfix "book" = "waterbook" 
"need" myinfix "education" = "needucation" 

ya me di cuenta de cómo devolver las zonas de solapamiento en las cuerdas con:

check x y = head $ filter (`isPrefixOf` y) (tails x) 

Pero no sé cómo incorporar en el que cualquier ayuda.?

+2

¿Por qué no es el tercer ejemplo '" needucation "'? –

+1

¿Y por qué no es el primer ejemplo '" eagleeyes "'? 'verificar" águila "" eagleeyes "=" águila "'. – dave4420

+0

Sí, lo siento chicos, me di cuenta de que cometí algunos errores en las salidas de ejemplo. He corregido ese – Bobo

Respuesta

8

Lo estás haciendo de la manera incorrecta.

(+++) :: Eq a => [a] -> [a] -> [a] 
xs  +++ ys | xs `isPrefixOf` ys = ys 
(x:xs) +++ ys      = x : (xs +++ ys) 

Es decir, realmente no te importa qué es la superposición, solo te importa si la has alcanzado.


Aquí hay otra solución sin la recursión explícita.

(++++) :: Eq a => [a] -> [a] -> [a] 
xs ++++ ys = prefix ++ ys 
    where (prefix, _) : _ = filter (\(_, overlap) -> overlap `isPrefixOf` ys) $ zip (inits xs) (tails xs) 

Aquí vamos sobre la búsqueda de la superposición, como en su check, pero en lugar de mantener la superposición, que dió la porción de xsque no solapamiento.

+0

Otro usando la función Data.List.stripPrefix: xs +++++ ys = xs ++ head [sufijo | Solo sufijo <- map (flip stripPrefix ys) (colas xs)] –

1
overlapConcat :: (Eq a) => [a] -> [a] -> [a] 
overlapConcat s t = s ++ drop (length $ check s t) t 

Esto no va a ser tan rápido como las otras versiones proporcionadas ya que llevará a cabo dos pases sobre s, pero creo que es más fácil de leer, y tiene un sentido intuitivo.