为什么Data.Text.Lazy.replace和Data.Text.Lazy.append不起作用?

时间:2011-08-25 06:32:41

标签: haskell

以下代码使用str1替换字符串的三种不同方式(str2str3Data.Text.Lazy.replace)。他们应该提供相同的输出。

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

然而,运行该程序的结果是:

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

为什么str2无法正常工作?代码有什么问题吗?

3 个答案:

答案 0 :(得分:5)

感谢错误报告,伙计们。我会调查一下,然后按照我的发现跟进。

答案 1 :(得分:4)

看起来像text库中的错误。

(我已经在错误跟踪器中添加了issue,以防作者没有访问Stack Overflow。)

答案 2 :(得分:3)

这是搜索代码中的一个错误:在模式的块边界上,在创建跳过表时省略了一个字符(井,代码单元),因此在某些输入上,搜索窗口移动得太远。 我已经给布莱恩发送了拉动请求。

由于您的模式由短文字组成,如果您使用优化进行编译,则不会找到错误。很好找。