
On Monday 27 June 2011, 11:15:13, Manfred Lotz wrote:
I tried now:
getXmlContent :: String -> Handle -> IO Ctan getXmlContent xf inh = do xml <- U.hGetContents inh let content = xml `deepseq` parseXMLDoc xml case content of ...
deepseq really ensures parseXmlDoc gets the full file as a string.
It is unclear to me how this could be done without deepseq.
To ensure that the entire file is read, you can seq on the length, xml <- U.hGetContents inh let content = parseXMLDoc xml length xml `seq` case content of ... that might be faster than deepseq (or it might make no difference, deepseq is cheap on Chars). In general, it is often good to avoid deepseq if that would traverse large data structures which are already evaluated (consider modifying a Map or something similar, if you force it with deepseq, each alteration is O(size), so it's worth some effort to find a way to only force the modified parts to have the alterations be O(log size)).