Haskell Read - 没有解析错误

时间:2012-02-24 09:42:43

标签: haskell

我有一个名为PartialDate的类型

然后我有一个功能

readPartialDate :: String -> Maybe 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,也使用反向,所以这里可能存在懒惰问题吗?

1 个答案:

答案 0 :(得分:4)

问题在于readsPrec的定义,

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

您将输入String本身作为readsPrec结果对的第二个组件。 read要求reads结果第二个组件为空,这意味着已经消耗了整个输入以确定值(通常,当您编写Read个实例时,请确保不要忘记使用尾随空格。将实例更改为

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

它应该有用。