J'ai fait un analyseur très simple pour les listes de nombres dans un fichier, en utilisant ReadP dans Haskell. Cela fonctionne, mais c'est très lent ... est ce comportement normal de ce type d'analyseur ou est-ce que je fais quelque chose de mal?Utilisation correcte de ReadP dans Haskell
import Text.ParserCombinators.ReadP
import qualified Data.IntSet as IntSet
import Data.Char
setsReader :: ReadP [ IntSet.IntSet ]
setsReader =
setReader `sepBy` (char '\n')
innocentWhitespace :: ReadP()
innocentWhitespace =
skipMany $ (char ' ') <++ (char '\t')
setReader :: ReadP IntSet.IntSet
setReader = do
innocentWhitespace
int_list <- integerReader `sepBy1` innocentWhitespace
innocentWhitespace
return $ IntSet.fromList int_list
integerReader :: ReadP Int
integerReader = do
digits <- many1 $ satisfy isDigit
return $ read digits
readClusters:: String -> IO [ IntSet.IntSet ]
readClusters filename = do
whole_file <- readFile filename
return $ (fst . last) $ readP_to_S setsReader whole_file
Quelle est la taille du fichier d'entrée? Je ne peux pas repérer tout ce qui serait pathologiquement lent, bien que je ne voudrais peut-être pas que setReader utilise une liste intermédiaire et que vous soyez meilleur avec l'un des ByteStrings qu'avec String pour l'entrée. En outre, il existe un readPen integer readP ReadIntP dans le module Text.Read.Lex - il peut améliorer les performances de votre IntegerReader. –
Merci pour l'aide Stephen. C'est la première fois que j'utilise ReadP, je ne connaissais pas Text.Read.Lex. – dsign