Je ne comprends pas ce que fait le type de (par exemple) eol
moyenne:mégaparsec: comment déclarer le type de `eol` pour analyser le texte et non [Char]
eol :: (MonadParsec e s m, Token s ~ Char) => m String
ou, mieux, Je ne comprends pas comment utiliser eol avec Text.Megaparsec.Text
et pas Text.Megaparsec.String
. J'ai essayé d'apprendre à utiliser Megaparsec suite au (ancien) tutoriel pour Parsec de Real World Haskell (j'ai d'abord commencé par lire le tutoriel RWH avant de découvrir que Megaparsec existait). J'ai réécrit le code of the first example pour utiliser Megaparsec (voir ci-dessous). Mais j'ai trouvé que quand j'essaye de forcer le type de eol
à Parser Text
le compilateur jette l'erreur: Couldn't match type ‘[Char]’ with ‘Text’
, ce que je comprends de ceci est que je ne peux pas utiliser eol
avec Text
ou, plus probablement, je ne sais pas comment changer cela Token s ~ Char
contexte de la déclaration eol
pour utiliser Token Text
.
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE NoImplicitPrelude #-}
module CSVParser (
module CSVParser
) where
import Foundation
import Data.Functor.Identity (Identity)
import Text.Megaparsec
import Text.Megaparsec.Text
import Data.Text
csvFile :: Parser [[Text]]
csvFile =
do result <- many line
eof
return result
line :: Parser [Text]
line =
do result <- cells
--eol :: Parser Text -- uncommenting this line results in a compilation error
eol
return result
cells :: Parser [Text]
cells =
do first <- cellContent
next <- remainingCells
return (first : next)
remainingCells =
(char ',' >> cells)
<|> return []
cellContent :: Parser Text
cellContent = fromList <$> many (noneOf [',','\n'])
parseCSV :: Text -> Either (ParseError (Token Text) Dec) [[Text]]
parseCSV = parse csvFile "(unknown)"
Pourquoi vous écrivez 'EOL :: Parser Text' quand vous ne tenez pas compte de son retour valeur quand même? –
Eh bien, je le fais parce que je veux savoir comment changer son type. Je veux changer son type parce que beaucoup d'autres fonctions dans la bibliothèque ont la même déclaration de type, prennent par exemple 'lowerChar :: (MonadParsec esm, Token s ~ Char) => m Char', je peux vouloir ne pas ignorer sa valeur de retour mais contraint à être "Texte" (pour cela je pourrais faire 'fromList <$> lowerChar', mais cela semble moche, je suppose que je pourrais juste changer le type directement, mais je ne sais pas, ou ne comprends pas, comment). Principalement mon problème est avec '(MonadParsec e s m, Token s ~ Char) => m Char'. – helq