The approach to the channel is not to collect the entire list at once and destroy it; The point of the pipeline (and pipes, another current popular solution to this problem) is that you only consume one element at a time. This is similar to lazy IO, except in a more fundamental way, because lazy IO really annoys reasoning and becomes correct.
The first step is to try to pull as much of your logic into pure functions as possible; instead of writing parseFile :: FileName -> Result, write parseContents :: String -> Resultand use readFile (well, probably you should also use Text or ByteString instead of String, but this does not apply).
: , , , . , , , conduit, - Source IO FilePath, , Conduit FilePath IO Text, , Sink Text Result, . , (source $= conduit) $$ sink - , IO Result.
, , btu. , .