2

所以我仍然在尝试使用 Parsec,但我正在慢慢地将它融入我的工具箱。

当我有一个需要解析的文件时,我发现自己将文件作为字符串读取,然后将内容传递给解析:

problem <- readFile input                               
case runParser myParser () input problem of
  Left err  -> hPutStrLn stderr $ "Error: " ++ show err 
  Right cs  -> -- continue processing...

不过,这似乎是一种相当常见的模式——我可以使用一些现有的函数来接受 aParsecT String u IO a和 aFilePath并解析内容吗?我在hoogle中找不到任何东西,但这可能只是想象力的失败。

4

1 回答 1

7

没有ParsecT,但有。但是,如果您的代码片段是准确的,那么您实际上并不需要解析器中的 ,所以这应该不是问题。这样的事情应该产生你想要的行为:parseFromFile:: Parser a -> String -> IO (Either ParseError a)IO

import Text.Parsec.String
import System.Exit
import System.IO

parse :: Parser a -> String -> IO a
parse p fileName = parseFromFile p fileName >>= either report return
  where
    report err = do
        hPutStrLn stderr $ "Error: " ++ show err
        exitFailure

它仍然有点冗长,但是您可以定义report一些通用的地方并在整个程序中使用它;然后parse是单线。

于 2012-04-05T22:48:26.687 回答