Haskell:使用Parsec和IO解析文件

ram*_*ion 2 io haskell parsec

所以我仍然在努力使用Parsec,但我正慢慢地将它用于我的工具箱.

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

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

这似乎是一个相当普遍的模式 - 是否有一些现有的功能,我可以使用a ParsecT String u IO a和a FilePath并解析内容?我在hoogle中找不到任何东西,但这可能只是想象力的失败.

ehi*_*ird 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
Run Code Online (Sandbox Code Playgroud)

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