J'essaie de créer un analyseur pour un format de fichier personnalisé. Dans le format, je travaille avec, certains champs ont une balise de fermeture comme ceci:Parsec renvoie [Char] au lieu du texte
<SOL>
<DATE>0517
<YEAR>86
</SOL>
Je suis en train de saisir la valeur entre les </
et >
et de l'utiliser dans le cadre du plus grand analyseur.
J'ai trouvé le code ci-dessous. Le problème est, l'analyseur renvoie [Char]
au lieu de Text
. Je peux emballer chaque Char
en faisant fmap pack $ return r
pour obtenir une valeur de texte, mais j'espérais que l'inférence de type me sauverait de devoir faire cela. Quelqu'un pourrait-il donner des conseils pour savoir pourquoi je suis de retour [Char]
au lieu de Text
, et comment puis-je récupérer Text
sans avoir à emballer manuellement la valeur?
{-# LANGUAGE NoMonomorphismRestriction #-}
{-# LANGUAGE OverloadedStrings #-}
import Data.Text
import Text.Parsec
import Text.Parsec.Text
-- |A closing tag is on its own line and is a "</" followed by some uppercase characters
-- followed by some '>'
closingTag = do
_ <- char '\n'
r <- between (string "</") (char '>') (many upper)
return r
Je pense que «beaucoup supérieur» est plus pertinent que «chaîne» ici, parce que «entre» renvoie uniquement le résultat de son troisième argument d'analyseur. –
Je vois que le type 'many upper' est' ParsecT sum [Char] ' J'avais l'impression que les valeurs' [Char] 'pouvaient être utilisées comme' Text' sans avoir à les empaqueter manuellement, si l'extension OverloadedStrings a été allumé? – Arnob
OverloadedString est une extension syntaxique et non une extension de type système. En particulier, il lit les littéraux de chaîne (éléments entre guillemets) comme étant dans la classe IsString. – nomen