我是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