2011-11-13 18 views
5

sample input/outputहो रही त्रुटि Prelude.read: कोई पार्स

मैं हास्केल में बहुत नया हूँ, मैं प्रत्येक आइटम के लिए विस्तार खोज आइटम जानकारी के लिए कोड लिखा था और।

type Code = Int 
type Name = String 
type Database = (Code,Name) 

textfile::IO() 
textfile = appendFile "base.txt" (show[(110,"B")]) 

खोज

fun::IO() 
fun=do putStrLn"Please enter the code of the product" 
     x<-getLine 
     let y = read x :: Int 
     show1 y 

textshow::IO [Database] 
textshow= do x<-readFile "base.txt" 
      let y=read x::[Database] 
     return y 

show1::Code->IO() 
show1 cd= do o<-textshow 
      let d=[(x,y)|(x,y)<-o,cd==x] 
     putStr(show d) 

के लिए कोड लेकिन, समस्या, यह एकल डेटा के लिए अच्छा काम कर रहा है अगर मैं एक और डेटा संलग्न है, तो यह त्रुटि Prelude.read: no parse जब मैं आइटम खोज करने के लिए कोशिश कर रहा हूँ दिखा है । सहायता की सराहना की जाएगी !!

+0

आप एक नमूना इनपुट है कि समस्या से चलाता है जोड़ सकते हैं? – ibid

+0

मैं नमूना आई/ओ स्नैप, कृपया पर एक नजर है अपलोड कर दिया है। –

+1

वहाँ भी textshow और show1 में खरोज मुद्दों है। लेकिन मुझे लगता है कि यह समस्या दिखाता है। जल्द ही जवाब दे रहा है। – ibid

उत्तर

4

आपकी समस्या अपनी डेटा फ़ाइल के प्रारूप में है। textfile में से एक उपयोग के बाद, फ़ाइल में निम्न शामिल हैं:

[(110,"B")] 

एक अच्छा सूची है यही कारण है कि, और यह काम करता है। textfile के दूसरे उपयोग के बाद, फ़ाइल में निम्न शामिल हैं:

[(110,"B")][(110,"B")] 

एक अच्छा सूची नहीं है यही कारण है कि, और यह विफल रहता है। आप ghci में देख सकते हैं:

*Main> read "[(110,\"B\")][(110,\"B\")]" :: [Database] 
*** Exception: Prelude.read: no parse 

यह स्पष्ट है कि read एक सूची उम्मीद नहीं दो सूचियों एक दूसरे को निम्नलिखित।

यदि आप एक फ़ाइल में संलग्न करना चाहते हैं जिसमें एक हैस्सेल सूची है, तो आपको फ़ाइल को पढ़ने, सूची में शामिल करने और प्रतिस्थापन के रूप में फ़ाइल में नई सूची लिखने की आवश्यकता है।

addToFileList :: (Read a, Show a) => FilePath -> a -> IO() 
addToFileList fp a = do olds <- readFile fp `catch` \e -> 
           if isDoesNotExistError e 
           then return "[]" 
           else ioError e 
         let oldl = read olds 
          newl = oldl ++ [a] 
          news = show newl 
         length news `seq` 
           writeFile fp news 

यह एक छोटे से है क्योंकि दो सी चीज़ें की मुश्किल है:

  • readFile आलसी है, और writeFile एक ही फाइल करने में विफल कर सकते हैं जब तक कि एक यकीन है कि पूरी फ़ाइल पहले से ही पढ़ा जा चुका है बनाता है। इस ऊपर समारोह फ़ाइल लिखने से पहले नई स्ट्रिंग की लंबाई के लिए पूछ द्वारा हल किया जाता है (seq समारोह है कि लंबाई से पहले लिखने आपरेशन होता है गणना की जाती है सुनिश्चित करती है)।
  • फ़ाइल मौजूद नहीं हो सकता है, catch खंड ऊपर है कि असाधारण मामले को संभालने के लिए प्रयोग किया जाता है।
संबंधित मुद्दे