Ich habe einen sehr einfachen Parser für Listen von Zahlen in einer Datei, mit ReadP in Haskell. Es funktioniert, aber es ist sehr langsam ... ist das normale Verhalten dieser Art von Parser oder mache ich etwas falsch?Korrekte ReadP-Verwendung in 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
Wie groß ist die Eingabedatei? Ich kann nichts finden, was pathologisch langsam wäre, obwohl ich vielleicht nicht wollen würde, dass setReader eine Zwischenliste verwendet und Sie vielleicht besser mit einem der ByteStrings als mit String für die Eingabe umgehen können. Außerdem gibt es im Text.Read.Lex-Modul einen ReadP-Ganzzahlparser readIntP, der die Leistung Ihres IntegerReaders verbessern könnte. –
Danke für die Hilfe Stephen. Es ist das erste Mal, dass ich ReadP benutze, ich wusste nichts über Text.Read.Lex. – dsign