我对 Haskell 和 Parsec 都是新手。为了进一步了解该语言和该库,特别是我正在尝试创建一个可以解析 Lua 保存的变量文件的解析器。在这些文件中,变量可以采用以下形式:
变量名 = 值
varname = {值,值,...}
varname = {{value, value},{value,value,...}}
我已经为这些类型中的每一个创建了解析器,但是当我将它们与选择 <|> 运算符串在一起时,我得到一个类型错误。
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 ","))