将字符串解析为数据类型:更好的错误消息?

时间:2015-05-30 15:21:22

标签: parsing haskell ghc

目前我使用的是将字符串解析为数据类型 来自read的{​​{1}}函数,如图所示 以下示例:

Text.Read

然而错误消息不是很好。例如,如果 我做了module Main where data Inner = Inner { x :: Int , y :: Double } deriving (Read,Show) data Outer = Outer { inner :: Inner } deriving (Read,Show) parseOuter :: Outer parseOuter = read "Outer { inner = Inner { x = 4, y = 4.5 } }" main = do print parseOuter --output : Outer {inner = Inner {x = 4, y = 4.5}} 然后我不小心让x成为Double 得到以下程序中显示的错误消息:

x = 4.3

haskell中是否有允许我使用的功能 做上述但有更好的错误消息?

1 个答案:

答案 0 :(得分:1)

如果您只想要更优雅的错误处理,可以使用

import Text.Read

parseOuter :: Maybe Outer
parseOuter = readMaybe "Outer { inner = Inner { x = 4, y = 4.5 } }"

main :: IO ()
main = do
  case parseOther of
    Just x  -> print x
    Nothing -> putStrLn "parse error"

对于更严重的错误处理,我会使用像parsec这样的正确解析库。 Parsec提供<?>运算符来使用有用的错误消息来修饰解析器:例如如果发生解析错误,myParser <?> "foo"将生成诸如“expected foo”之类的消息。