【发布时间】:2016-03-24 01:11:05
【问题描述】:
我正在解析一种语言,我希望在解析时使用$include 其他文件的语法。
我的代码:
import Text.ParserCombinators.Parsec
import Text.Parsec.Prim (parserZero)
import Text.ParserCombinators.Parsec.Char
import Control.Monad.Trans
import Data.Functor.Identity
notaInclude :: Parser [SourcesItem]
notaInclude = do
try $ string "$Include" >> blanks1
char '"'
fileName <- quotedStringParser
char '"'
i <- getInput
included <- liftIO $ readFile fileName
setInput included
si <- sources
setInput i
return si
来自 GHC 的错误信息:
Lazi/Lazi'nh/Language/Sources/Parser.hs:65:17:
No instance for (MonadIO Identity) arising from a use of `liftIO'
Possible fix: add an instance declaration for (MonadIO Identity)
In the expression: liftIO
In a stmt of a 'do' block: included <- liftIO $ readFile fileName
In the expression:
do { try
(do { string "$Include";
blanks1 });
char '"';
fileName <- quotedStringParser;
char '"';
.... }
我怎样才能让它工作?
【问题讨论】:
-
您不能在
Parser内执行IO,但如果您将解析器类型更改为ParsecT String () IO,它将起作用。