2011-08-25 7 views
7

Data.Text.Lazy.replaceを使用して文字列を置き換える3つの異なる方法(str1str2、およびstr3)があります。彼らは同じ出力を与えるべきです。なぜData.Text.Lazy.replaceとData.Text.Lazy.appendは機能しませんか?

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

なぜSTR2が正しく動作しません:プログラムを実行しているの結果があるしかし

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 

?コードに何か問題はありますか?

+0

str2では、キー値にDTL.packの後に$を使用できますか? – Ankur

答えて

4

textライブラリのバグのようです。

(著者はスタックオーバーフローを訪問することは起こらない場合には、私はバグトラッカーにissueを追加しました。)バグレポートのための

5

おかげで、みんな。私はそれを見て、ここで私が見つけたものをフォローアップします。

+0

フォローアップ(ごめんなさい申し訳ありません) –

3

パターンのチャンク境界で、スキップテーブルの作成で1文字(井戸、コード単位)が省略されたため、特定の入力では検索ウィンドウも移動しました遠い 私はBryanに修正プログラムのプルリクエストを送信しました。

パターンが短いリテラルで構成されているため、最適化してコンパイルしても、バグを見つけられませんでした。良い発見。

関連する問題