2012-02-24 7 views
2

私は ハスケル読む - なしパースエラー

は、その後、私は

readPartialDate :: String -> Maybe PartialDate 

ビットテストコードの機能を持っているPartialDate

と呼ばれるタイプがあり

main = do 
     [d] <- getArgs 
     return $ show $ readPartialDate d 
runhaskell PartialDate.hs "12-2-2010" 
"Just 12-2-2010" 

すべてOK

それから私はreadPartialDateにディスパッチすることにより、簡単に読み取り、作成:

instance Read PartialDate where 
     readsPrec _ s = case (readPartialDate s) of 
           Nothing -> [] 
           Just p -> [(p, s)] 

テストコード:

main = do 
     [d] <- getArgs 
     return $ show $ ((read d) :: PartialDate) 
runHaskell PartialDate.hs 12-2-2010 
PartialDate.hs: Prelude.read: no parse 

読み取りに仕事関数を置くことに上昇を与えるかもしれない、なぜ誰もが知っていますが解析エラー?

readPartialDateはParsecを使用していますが、逆も使用していますので、ここで怠惰の問題がありますか?

答えて

4

問題がreadsPrec

readsPrec _ s = case (readPartialDate s) of 
         Nothing -> [] 
         Just p -> [(p, s)] 

の定義に使用すると、readsPrec結果対の第2成分としての入力文字列自体を与えることです。 readの場合、readsの結果に2番目のコンポーネントが空でなければなりません。これは、入力全体が値を決定するために消費されたことを意味します(一般に、Readインスタンスを書き込むときには空白を残すことを忘れないでください)。インスタンスを

readsPrec _ s = case (readPartialDate s) of 
         Nothing -> [] 
         Just p -> [(p, "")] 

に変更してください。

+0

素晴らしい。ありがとうダニエル –

+0

@RobertOnslow:これがあなたの質問に答えた場合は、そのようにマークすることを忘れないでください。 – ivanm