我是Haskell和Parsec的新手。在努力了解更多的语言,特别是我想创建一个解析器,可以解析Lua中保存的变量文件库。在这些文件中的变量可以采取以下形式:Haskell's Parsec的问题<|>运营商
VARNAME =价值
VARNAME = {值,值,...}
VARNAME = {{值,值},{价值,价值, ...}}
我创建的解析器每种类型的,但是当我把它们串与选择<一起|>运营商,我得到一个类型错误。
Couldn't match expected type `[Char]' against inferred type `Char'
Expected type: GenParser Char st [[[Char]]]
Inferred type: GenParser Char st [[Char]]
In the first argument of `try', namely `lList'
In the first argument of `(<|>)', namely `try lList'
我的假设是(虽然我不能在文档中找到它)传递给选择运营商每个解析器必须返还相同种类。 这里是有问题的代码:
data Variable = LuaString ([Char], [Char])
| LuaList ([Char], [[Char]])
| NestedLuaList ([Char], [[[Char]]])
deriving (Show)
main:: IO()
main = do
case (parse varName "" "variable = {{1234,\"Josh\"},{123,222}}") of
Left err -> print err
Right xs -> print xs
varName :: GenParser Char st Variable
varName = do{
vName <- (many letter);
eq <- string " = ";
vCon <- try nestList
<|> try lList
<|> varContent;
return (vName, vCon)}
varContent :: GenParser Char st [Char]
varContent = quotedString
<|> many1 letter
<|> many1 digit
quotedString :: GenParser Char st [Char]
quotedString = do{
s1 <- string "\"";
s2 <- varContent;
s3 <- string "\"";
return (s1++s2++s3)}
lList :: GenParser Char st [[Char]]
lList = between (string "{") (string "}") (sepBy varContent (string ","))
nestList :: GenParser Char st [[[Char]]]
nestList = between (string "{") (string "}") (sepBy lList (string ","))
变量数据类型旨在将变量名称和变量内容封装在元组中。我可以从你和Martijn的回应中看出,这不是最好的行动方式,因为我需要一个额外的抽象层。 我有一个关于你的回应的问题,但: >运营商在你的代码中的作用是什么? (我以为他们只是为了错误信息)。 – GraemeFore 2010-11-20 11:42:01
我没有使用'>'。也许你的意思是'<$>'。这只是'fmap'的中缀速记,所以'LuaString <$> identifier'的意思是“解析一个标识符,然后用'LuaString'函数包装结果。 – luqui 2010-11-20 12:07:08
Yikes!为什么你不应该在通宵的时候发布问题的完美例子。再次感谢。 – GraemeFore 2010-11-20 22:18:09