2011-08-25 8 views
7

निम्नलिखित कोड में Data.Text.Lazy.replace का उपयोग कर स्ट्रिंग को प्रतिस्थापित करने के तीन अलग-अलग तरीके हैं (str1, str2, और str3)। उन्हें एक ही आउटपुट देना चाहिए।डेटा.Text.Lazy.replace और 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 

हालांकि कार्यक्रम चलाने का परिणाम है:

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

str2 सही ढंग से काम क्यों नहीं करता है? क्या कोड में कुछ गड़बड़ है?

+0

str2 में आप कुंजी मूल्य के लिए DTL.pack के बाद $ का उपयोग करने का प्रयास कर सकते हैं? – Ankur

उत्तर

4

text लाइब्रेरी में एक बग की तरह दिखता है।

(मैं बग ट्रैकर मामले में लेखक स्टैक ओवरफ़्लो यात्रा करने के लिए नहीं होता है के लिए एक issue जोड़ दिया है।)

5

बग रिपोर्ट, दोस्तों के लिए धन्यवाद। मैं इसे देख लूंगा, और जो कुछ मुझे मिल रहा है उसके साथ यहां देखें।

+0

कोई भी अनुवर्ती? (अधीरता के लिए खेद है) –

3

यह खोज कोड में एक बग था: पैटर्न की खंड सीमाओं पर, स्किप-टेबल के निर्माण में एक वर्ण (अच्छी तरह से, कोड इकाई) छोड़ा गया था, इसलिए कुछ इनपुट पर, खोज विंडो भी स्थानांतरित हो गई थी दूर। मैंने ब्रायन को फिक्स के लिए पुल अनुरोध भेजा है।

चूंकि आपके पैटर्न छोटे अक्षर से बने हैं, इसलिए आपने ऑप्टिमाइज़ेशन के साथ संकलित किया था, तो आप बग नहीं ढूंढ पाएंगे। अच्छा खोज

संबंधित मुद्दे