Je ne connais pas à la fois Haskell et Parsec. Dans un effort pour en savoir plus sur la langue et cette bibliothèque en particulier, j'essaye de créer un analyseur qui peut analyser les fichiers variables sauvegardés par Lua. Dans ces variables fichiers peuvent prendre les formes suivantes:Problèmes liés à l'opérateur Parsec <|> de Haskell
varname = valeur
varname = {valeur, valeur, ...}
varname = {{valeur, valeur}, {valeur, valeur, ...}}
J'ai créé des analyseurs pour chacun de ces types mais quand je les enchaîne avec l'opérateur < |> choisi, j'obtiens une erreur de type.
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'
Mon hypothèse est (bien que je ne le trouve pas dans la documentation) que chaque analyseur transmis à l'opérateur de choix doit retourner le même type. Voici le code en question:
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 ","))
Le type de données Variable était destiné à encapsuler le nom de la variable et le contenu de la variable dans un tuple. Je peux voir à partir de la vôtre et des réponses de Martijn que ce n'est pas le meilleur plan d'action parce que j'ai besoin d'une couche supplémentaire d'abstraction. J'ai une question à propos de votre réponse: À quoi servent les opérateurs > figurant dans votre code? (Je pensais qu'ils étaient juste pour les messages d'erreur). – GraemeFore
Je n'ai pas utilisé '>'. Peut-être que vous voulez dire '<$>'. C'est juste un raccourci infixe pour 'fmap', donc' LuaString <$> identifier' signifie "analyser un identifiant, puis encapsuler le résultat avec la fonction' LuaString' ". – luqui
Yikes! Exemple parfait de pourquoi vous ne devriez pas poser de questions pendant une nuit blanche. Merci encore. – GraemeFore