2011-11-13 17 views
5

sample input/outputalma hatası Prelude.read: Ben Haskell çok yeniyim hiçbir ayrıştırma

i öğe detayları için kod yazdım ve her öğe için detay arayın.

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

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

arama

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) 

için kod ama, sorun ben başka veri ekleme, eğer ben öğeyi aramak için çalışıyorum o zaman hata Prelude.read: no parse gösteren, tek veriler için iyi çalışıyor ise . Yardımı takdir edilecektir!

+0

Sorunu tetikleyen örnek bir giriş ekleyebilir misiniz? – ibid

+0

Örnek i/o snap yükledim, lütfen bir göz atın. –

+1

Ayrıca, metin gösterisi ve show1'de girinti sorunları var. Ama bence bu problemi gösteriyor. Kısaca cevap vermek. – ibid

cevap

4

Sorununuz, veri dosyanızın biçimindedir. textfile biri kullanımdan sonra dosya aşağıdaki içeriklere: İyi bir liste var

[(110,"B")] 

, ve çalışıyor. textfile ikinci kullanımdan sonra dosya aşağıdakileri içerir:

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

iyi bir liste değildir, ve o başarısız olur. Sen ghci Bu görebilirsiniz:

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

Bu açık read tek bir liste beklediği değil, iki listeleri birbirini izleyen. Tek bir Haskell listesini içeren bir dosyaya eklemek istiyorsanız

, dosyayı okumak listeye eklenecek ve yerine dosyasında yeni bir liste yazmak gerekir.

  • readFile tembel ve bir bütün dosya zaten okundu emin olur sürece aynı dosyaya writeFile başarısız olabilir:

    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 
    

    Bunun nedeni iki tings biraz zordur. Yukarıdaki işlevde, dosya yazılmadan önce yeni dizenin uzunluğunun sorulmasıyla çözülür (seq işlevi, yazma işleminin gerçekleşmesinden önce uzunluğun hesaplandığından emin olur).

  • dosya mevcut olmayabilir, bu olağanüstü durumu işlemek için yukarıda catch madde kullanılır.
İlgili konular