我有一个名为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,也使用反向,所以这里可能存在懒惰问题吗?
答案 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, "")]
它应该有用。