Hice un analizador muy simple para listas de números en un archivo, usando ReadP en Haskell. Funciona, pero es muy lento ... ¿es este comportamiento normal de este tipo de analizador o estoy haciendo algo mal?Uso correcto de ReadP en 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
¿Qué tan grande es el archivo de entrada? No puedo encontrar nada que sea patológicamente lento, aunque tal vez no quisiera que setReader utilizara una lista intermedia y es posible que sea mejor con uno de ByteStrings en lugar de String para la entrada. Además, hay un analizador de lecturas enteras ReadP readIntP en el módulo Text.Read.Lex - podría mejorar el rendimiento sobre su integerReader. –
Gracias por la ayuda Stephen. Es la primera vez que uso ReadP, no sabía nada de Text.Read.Lex. – dsign