Итак, я поиграл с несколькими библиотеками на Haskell XML, включая hexpat и xml-enumerator.После прочтения главы IO в реальном мире на Haskell (http://book.realworldhaskell.org/read/io.html) у меня сложилось впечатление, что, если я запущу следующий код, он будет собирать мусор при его выполнении.
Однако, когда я запускаю егобольшой файл, использование памяти продолжает расти.
runghc parse.hs bigfile.xml
Что я делаю неправильно? Мое предположение неверно? Карта или фильтр заставляют его все оценивать?
import qualified Data.ByteString.Lazy as BSL
import qualified Data.ByteString.Lazy.UTF8 as U
import Prelude hiding (readFile)
import Text.XML.Expat.SAX
import System.Environment (getArgs)
main :: IO ()
main = do
args <- getArgs
contents <- BSL.readFile (head args)
-- putStrLn $ U.toString contents
let events = parse defaultParseOptions contents
mapM_ print $ map getTMSId $ filter isEvent events
isEvent :: SAXEvent String String -> Bool
isEvent (StartElement "event" as) = True
isEvent _ = False
getTMSId :: SAXEvent String String -> Maybe String
getTMSId (StartElement _ as) = lookup "TMSId" as
Моя конечная цель - проанализировать огромный xml-файл с простым саксофонным интерфейсом. Мне не нужно знать всю структуру, чтобы получать уведомления о том, что я нашел «событие».