Вы получите, вероятно, много ответов, с этим я столкнулся, пытаясь создать какое-то «реальное» приложение.
Я использовал многопоточность и некоторые MVars для передачи данных (MVar - это что-то вроде заблокированной общей памяти). Мой типичный образец был:
a <- takeMVar mvar
putMVar mvar (a + 1)
А потом, просто иногда, когда возникало правильное состояние, я делал что-то вроде:
a <- takeMVar mvar
when (a > 10) ....
Проблема в том, что содержание mvar было по существу (0 + 1 + 1 + 1 + ....) ... которое было довольно интенсивным для чисел типа 100k ... Этот тип проблемы был довольно распространенным в моей код; к сожалению, для многопоточных приложений очень легко попасть в такие проблемы.
Обнаружение ... то, что я делал, запускало haskell в режиме, который выдает данные о потреблении памяти, запускает и останавливает различные потоки и проверяет, стабильно ли занимаемая память или нет ...
Анотомия протечки (с инструкциями по ее устранению)
Пример: Утечка памяти в результате функции карты