2011-11-13 6 views
5

sample input/output取得中にエラーPrelude.read:いいえ、私はHaskellで非常に新しいです

を解析し、私はアイテムの詳細のためのコードを書いていないし、各項目の詳細を検索します。

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

サンプルi/oスナップをアップロードしました。どうぞご覧ください。 –

+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はない二つのリストがお互いに続いて、単一のリストを期待していることは明らかです。

1つのHaskellリストを含むファイルに追加する場合は、ファイルを読み込んでリストに追加し、新しいリストをファイルに書き替える必要があります。

  • readFileは怠け者で、もう1つは、ファイル全体が既に読み込まれていることを確認しない限り、同じファイルにwriteFileは失敗する可能性があります:

    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 
    

    これは、2ティンズの少しトリッキーです。上記の関数では、ファイルを書き込む前に新しい文字列の長さを尋ねることで解決します(seq関数は、長さが書き込み操作が行われる前に計算されることを保証します)。

  • ファイルが存在しない可能性があります。その例外的なケースを処理するために上記のcatch句が使用されています。
関連する問題