Я пытаюсь обернуть монаду Data.Binary.Put в другую, чтобы позже я мог задавать ей вопросы вроде «сколько байтов она собирается записать» или «какова текущая позиция в файл". Но даже очень тривиальные обертки вроде:
data Writer1M a = Writer1M { write :: P.PutM a }
or
data Writer2M a = Writer2M { write :: (a, P.Put) }
создают огромную утечку места, и программа обычно дает сбой (после использования 4 ГБ ОЗУ). Вот что я Вот пример кода, демонстрирующего проблему: http://hpaste.org/43400/why_wrapping_the_databinaryp
UPDATE2: Также есть вторая часть этого вопроса здесь .