目前我使用的是将字符串解析为数据类型
来自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中是否有允许我使用的功能 做上述但有更好的错误消息?
答案 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”之类的消息。