2011-08-25 14 views
7

En el siguiente código hay tres formas diferentes (str1, str2 y str3) de reemplazar una cadena usando Data.Text.Lazy.replace. Deberían dar el mismo resultado.¿Por qué no funcionan Data.Text.Lazy.replace y Data.Text.Lazy.append?

import Data.Text.Lazy as DTL 

str1 :: String 
str1 = DTL.unpack $ DTL.replace key value text 
    where key = DTL.pack "<<name>>" 
     value = DTL.pack "Joyce" 
     text = DTL.pack "Hello, <<name>>." 

str2 :: String 
str2 = DTL.unpack $ DTL.replace key value text 
    where key = DTL.pack "<<" `DTL.append` DTL.pack "name" 
          `DTL.append` DTL.pack ">>" 
     value = DTL.pack "Joyce" 
     text = DTL.pack "Hello, <<name>>." 

str3 :: String 
str3 = DTL.unpack $ DTL.replace key value text 
    where key = DTL.pack $ "<<" ++ "name" ++ ">>" 
     value = DTL.pack "Joyce" 
     text = DTL.pack "Hello, <<name>>." 

main :: IO() 
main = do putStrLn str1 
      putStrLn str2 
      putStrLn str3 

Sin embargo, el resultado de la ejecución del programa es:

Hello, Joyce. 
Hello, <<name>>. 
Hello, Joyce. 

¿Por qué str2 no funciona correctamente? ¿Hay algo mal con el código?

+0

En str2 ¿puede intentar usar $ after DTL.pack para obtener el valor clave? – Ankur

Respuesta

4

Parece un error en la biblioteca text para mí.

(He añadido un issue al seguimiento de fallos en caso de que el autor no le sucede a visitar desbordamiento de pila.)

5

Gracias por el informe de error, chicos. Lo investigaré y haré un seguimiento aquí con lo que encuentre.

+0

¿Algún seguimiento? (Perdón por impaciencia) –

3

Era un error en el código de búsqueda: en los límites del fragmento del patrón, se omitió un carácter (bien, unidad de código) en la creación del skip-table, por lo que en ciertas entradas, la ventana de búsqueda también se movió lejos. He enviado a Bryan una solicitud de extracción para la solución.

Dado que sus patrones se componen de literales cortos, si hubiera compilado con optimizaciones, no habría localizado el error. Buen descubrimiento.

Cuestiones relacionadas