Дело не в том, что он открывает файлы до того, как они понадобятся;это то, что он не закрывает их, пока вы не форсируете всю строку.Простой способ обойти эту проблему - заставить всю строку сразу после ее прочтения;Так как Векторы строгие, самый простой способ сделать это - заставить Вектор быть оцененным после его анализа:
getFinal :: IO DF2
getFinal = foldl1' (liftA2 (+)) $ map getDF2 [1..(sdNumber runParameters)]
where getDF2 i = readFile ("DF2/DF2_" ++ show i) >>= evaluate . parseDF2
Используется Control.Exception.evaluate ;вы можете думать о evaluate
как о форсировании его аргумента и его возврате.Однако это работает только в том случае, если parseDF2
использует всю строку.
Более элегантным решением было бы полностью отказаться от ленивого ввода-вывода и использовать итерации или что-то в этом роде.Но это, вероятно, не стоит для такого простого варианта использования.